@Transactional注解式事务使用注意点

Spring支持使用注解模式方便地使用事务,@Transactional修饰方法时表示该方法开启事务,修饰类时则表示类中所有方法皆开启事务。@Transactional具有以下属性:

属性名说明
name当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。
propagation事务的传播行为,默认值为 PROPAGATION_REQUIRED。
isolation事务的隔离度,默认值采用 DEFAULT。
timeout事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。
read-only指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
rollback-for用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
no-rollback- for抛出 no-rollback-for 指定的异常类型,不回滚事务。

其中propagation和isolation最需关注,事务传播方式的有以下几种:

事务传播方式说明
PROPAGATION_REQUIRED如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认值。
PROPAGATION_REQUIRES_NEW创建一个新的事务,如果当前存在事务,则把当前事务挂起。
PROPAGATION_SUPPORTS如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
PROPAGATION_NOT_SUPPORTED以非事务方式运行,如果当前存在事务,则把当前事务挂起。
PROPAGATION_NEVER以非事务方式运行,如果当前存在事务,则抛出异常。
PROPAGATION_MANDATORY如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
PROPAGATION_NESTED如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

事务的隔离级别则分为:

事务隔离级别说明
DEFAULT默认级别,沿用数据源的隔离级别,以MySQL为例,默认的隔离级别通常为REPEATABLE_READ。
READ_UNCOMMITTED读未提交,最低的隔离级别,一个事务能读取到别的事务未提交的更新数据,很不安全,可能出现丢失更新、脏读、不可重复读、幻读。
READ_COMMITTED读已提交,可以防止更新丢失、脏读,但不能防止不可重复读、幻读。
REPEATABLE_READ可重复读取,可以防止更新丢失、脏读、不可重复读,但不能防止幻读。
SERIALIZABLE可序列化,可以防止更新丢失、脏读、不可重复读、幻读。

@Transactional使用注意点

在使用事务注解时需注意一下几点,防止事务失效,发生异常时未如预料般回滚:
1、在默认配置下,Spring只会在遇到unchecked 运行时异常,即RunTimeException或Error时才会回滚事务,而当使用try-catch块捕获并处理异常时,Spring并不会抛出回滚事务。而非运行时异常必须catch处理才能通过java编译,因此默认情况下发生非运行时异常都不会使事务回滚。若想使Spring在遇到非运行时异常时也回归事务,则需要在@Transactional注解中显式地配置对应异常类:
@Transactional(rollbackFor=“MyException”)

2、所有@Transactional修饰的方法都必须是public方法,否则事务不生效。Spring实现事务的原理是利用AOP动态代理,为什么需要是public的,因为在处理事务的时候,Spring代理的时候使用的是CGLIB的方式,这种方式不是根据接口去创建代理的,而是继承被代理类,重写它的方法,所以不可以是private的。

3、若调用一个未被@Transactional修饰的方法A,方法A中再调用被@Transactional修饰的方法B,则B方法不会以事务的方式执行。其中原因也是由于@Transactional由AOP动态代理实现。在外部调用这个动态代理对象,会在代理的时候增强对象,但在对象的内部调用的时候,调用的还是原来的对象的方法,该方法不会被AOP增强。

相关链接
https://blog.csdn.net/jiangyu1013/article/details/84397366?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
https://www.cnblogs.com/luchangjiang/p/10462951.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值