SpringBoot事务管理
时间:2022-07-22
本文章向大家介绍SpringBoot事务管理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
下面的图片来自网络,或许可以帮你很好的理清楚思路。
值得一提的是,事务为什么要放在Service层呢,我们进行事务管理的目的就是为了使几个对持久层的操作要么都成功,要么都失败,而不是一个失败一个成功,这样子数据就会出现很多问题,比如脏读、不可重复读、幻读
首先我们先了解下Spring的事务管理的使用。常见的都会用xml的配置方式来使用Spring AOP切面编程,把事务以切面的方式注入到Service层。
我们首先配置了事务管理器(txManager),传入数据源(dataSource),配置事务通知(txAdivce),最后将【事务管理器】切入需要进行事务管理的Service方法中。
<!-- 事务管理 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 事务通知(隔离级别、传播行为) -->
<tx:advice id="txAdivce" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="find*" read-only="false"/>
<tx:method name="get*" read-only="false"/>
</tx:attributes>
</tx:advice>
<!-- 切入事务 -->
<aop:config>
<aop:pointcut expression="execution(* com.*.service.*.*(..))" id="txPointcut"/>
<aop:advisor advice-ref="txAdivce" pointcut-ref="txPointcut"/>
</aop:config>
而Spring Boot中的推荐操作是使用@Transactional注解来申明事务。要在Spring boot中支持事务,首先要导入Spring boot提供的JDBC或JPA依赖(二选一即可):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<scope>test</scope>
</dependency>
Spring Boot会自动默认分别注入DataSourceTransactionManager或者是JpaTransactionManager, 并进行一系列的事务初始化操作,所以我们不需要任何额外配置。直接使用@Transactional注解进行事务管理。
不过在传统的工程中也可以使用@Transactional注解来申明事务,但是使用XML来配置事务管理器(DataSourceTransactionManager)是必不可少的。
Spring Boot会自动到Spring容器中寻找我们配置好的DataSource。
@Transactional的使用
- @Transactional不仅可以注解在方法上,也可以注解在类上。
- @Transactional 注解应该只被应用到 public 方法上。
- 当注解在类上的时候意味着此类的所有public方法都是开启事务的。
- 如果类级别和方法级别同时使用了@Transactional注解,则使用在类级别的注解会重载方法级别的注解。
在SpringBoot中使用@Transactional注解需要在启动类上添加@EnableTransactionManagement注解开启事务支持。
@Transactional属性信息
- Spark入门,概述,部署,以及学习(Spark是一种快速、通用、可扩展的大数据分析引擎)
- 创建基于MailKit和MimeKit的.NET基础邮件服务
- 把一个矩阵行优先展成一个向量,numpy.ravel() vs numpy.flatten()区别
- dataframe插入数据报错SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a
- python 对矩阵进行复制操作 np.repeat 与 np.tile区别
- python标准异常:中英文对比
- 激活windows10转到电脑设置的水印消失3种方法总结
- Android 运行时权限及APP适配
- python如何保存矩阵,保存matrix,保存numpy.ndarray
- SDP(12): MongoDB-Engine - Streaming
- .NET Core开源API网关 – Ocelot中文文档
- Selenium的使用方法简介
- 爬虫代理哪家强?十大付费代理详细对比评测出炉!
- HTML5中类jQuery选择器querySelector的使用
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Python全栈(七)Flask框架之1.Flask简介与URL和视图介绍
- 两个CSS知识点:BFC和选择器权重
- C语言入门系列之9.预处理
- Python爬虫常见异常及解决办法
- 理解nodejs中js和c++的通信原理
- 如何使用FFmpeg将互联网直播点播平台内直播视频流转化为HLS流?
- 记一次nodejs问题排查
- 使用Go语言编译互联网视频直播点播平台EasyDSS出现ld returned 1 exit status错误
- c/c++补完计划(四): 字节对齐和虚继承
- Python 不用selenium 带你高效爬取京东商品评论
- 《闲扯Redis六》Redis五种数据类型之Hash型
- rocketmq学习2
- Python全栈(八)Flask项目实战之1.项目搭建
- 一起来读开源项目的代码-Agar.io为例
- C语言入门系列之11.文件和文件操作