一、介绍
- Spring事务的本质,其实就是通过 Spring AOP 切面技术
- Spring事务支持2种使用方式
- 声明式事务(注解方式)
- 编程式事务(代码方式):代码需要手动控制,比较繁琐,一般不使用
二、开启事务
-
SpringBoot文章来源:https://www.toymoban.com/news/detail-833930.html
- 默认开启了事务
-
Spring文章来源地址https://www.toymoban.com/news/detail-833930.html
<!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 注解驱动,值为事务管理器的id --> <tx:annotation-driven transaction-manager="transactionManager"/>
三、声明式事务(@Transactional)
1、原理
- Spring的事务是使用AOP来实现的,在执行目标方法的前和后,加上了事务管理的代码,在目标方法执行成功后,提交事务,抛出异常,则回滚事务
2、注解标注的位置
- 接口上:不推荐。Spring事务是通过AOP来实现的,而AOP是基于动态代理实现的,AOP的动态代理有2种方式,如果配置了 AOP为cglib(基于类),将会导致该注解失效
- 类上:该类所有的public方法都配置相同的事务属性
- 方法上:当类上标注了,方法上也标注了,方法上标注的优先级更高
3、事务的条件
- 含有注解的类必须被Spring管理,加载到IOC容器中
- 方法必须是public,没有权限访问则无法进行事务管理
- 如果视为操作错误,必须抛出异常,默认只有抛出RuntimeException 或者 Error才会回滚
4、事务生效、不生效的场景
- 数据库表的引擎不是innodb。不生效
- 含有注解的类没有加载到IOC容器中。不生效
- 注解标注在非public的方法上。不生效
- 抛出的异常不是指定的回滚异常类型
rollbackFor
、rollbackForClassName
、noRollbackFor
、noRollbackForClassName
。不生效 - 抛出的异常被catch了。不生效
- methodA调用methodB,2个方法在同1个类
- methodA上不加注解,methodB上加注解。methodB的事务不生效
- methodA上加注解,methodB加不加注解,事务都是有效的。则AB在同一事务中
- methodA调用methodB,2个方法在不同的类
- methodA加注解,methodB加不加注解,事务都是有效的
- methodA不加注解,methodB加注解,只有B是有事务的
5、@Transactional属性
1、value、transactionManager
- 指定事务管理器
- 一个工程可能访问多个数据源,可能会配置多个事务管理器
2、propagation
- 事务的传播行为(7种)
//如果当前存在事务则加入事务;如果当前不存在事务,则创建一个新的事务。默认
Propagation.REQUIRED
//如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行
Propagation.SUPPORTS
//如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常
//与Propagation.NEVER相反
Propagation.MANDATORY
//不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的
Propagation.REQUIRES_NEW
//以非事务的方式执行,如果当前存在事务,则将其挂起
Propagation.NOT_SUPPORTED
//以非事务的方式运行;如果当前存在事务,则抛出异常
//与Propagation.MANDATORY相反
Propagation.NEVER
//如果当前存在事务,则在该事务内嵌套事务运行;如果当前不存在事务,则创建一个新的事务
Propagation.NESTED
3、isolation
- 事务隔离级别
//。默认
Isolation.DEFAULT
//读取未提交数据,可能会出现脏读、不可重复读、幻读
Isolation.READ_UNCOMMITTED
//读取已提交数据,可能会出现不可重复读、幻读
Isolation.READ_COMMITTED
//可重复读,可能会出现幻读
Isolation.REPEATABLE_READ
//串行化读取,事务只能依次执行,避免了脏读、不可重复读、幻读。执行效率低
Isolation.SERIALIZABLE
4、timeout
- 事务超时
- 单位s,默认-1
- 是指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务,并抛出TransactionTimedOutException异常,阻止可能出现的长时间的阻塞系统或者占用系统资源
5、readOnly
- 是否只读
- true-只读,如果方法内存在增、删、改则会抛出异常;false-读写,增、删、改、查操作都允许。默认false
6、rollbackFor
- 回滚的异常类型
- 异常类的class数组,
Class<? extends Throwable>[]
7、rollbackForClassName
- 不会回滚的异常类型
- 异常类名的String数组,String[]
8、noRollbackFor
- 不会回滚的异常类型
- 异常类的class数组,
Class<? extends Throwable>[]
9、noRollbackForClassName
- 不会回滚的异常类型
- 异常类名的String数组,String[]
到了这里,关于Spring的事务(@Transactional)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!