Spring事务管理

事务如何使用

事务分为编程式事务和声明式事务两种。编程式事务指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强。声明式事务是基于 AOP 面向切面的,它将具体业务与事务处理部分解耦,代码侵入性很低,声明式事务也有两种实现方式,一种是基于 TX 和 AOP 的 xml 配置文件方式,二种就是基于 @Transactional 注解了,实际开发中 @Transactional 用的比较多。

@Transactional 可以作用在类上,当作用在类上的时候,表示所有该类的 public 方法都配置相同的事务属性信息。@Transactional 也可以作用在方法上,当方法上也配置了 @Transactional,方法的事务会覆盖类的事务配置信息。

事务的传播

事务的传播性一般用在事务嵌套的场景,比如一个事务方法里面调用了另外一个事务方法,那么两个方法是各自作为独立的方法提交还是内层的事务合并到外层的事务一起提交,这就是需要事务传播机制的配置来确定怎么样执行。
常用的事务传播机制如下:

PROPAGATION_REQUIRED

Spring默认的传播机制,能满足绝大部分业务需求,如果外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。如果外层没有事务,新建一个事务执行

PROPAGATION_REQUES_NEW

该事务传播机制是每次都会新开启一个事务,同时把外层事务挂起,当当前事务执行完毕,恢复上层事务的执行。如果外层没有事务,执行当前新开启的事务即可

PROPAGATION_SUPPORT

如果外层有事务,则加入外层事务,如果外层没有事务,则直接使用非事务方式执行。完全依赖外层的事务

PROPAGATION_NOT_SUPPORT

该传播机制不支持事务,如果外层存在事务则挂起,执行完当前代码,则恢复外层事务,无论是否异常都不会回滚当前的代码

PROPAGATION_NEVER

该传播机制不支持外层事务,即如果外层有事务就抛出异常

PROPAGATION_MANDATORY

与NEVER相反,如果外层没有事务,则抛出异常

PROPAGATION_NESTED

该传播机制的特点是可以保存状态保存点,当前事务回滚到某一个点,从而避免所有的嵌套事务都回滚,即各自回滚各自的,如果子事务没有把异常吃掉,基本还是会引起全部回滚的。

传播规则回答了这样一个问题:一个新的事务应该被启动还是被挂起,或者是一个方法是否应该在事务性上下文中运行。

事务失效场景或者事务使用避坑

1、@Transactional 应用在非 public 修饰的方法上,@Transactional 将会失效。protected、private 修饰的方法上使用 @Transactional 注解,虽然事务无效,但不会有任何报错,这是我们很容犯错的一点。

2、@Transactional 注解属性 propagation 设置错误。PROPAGATION_SUPPORTS、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER上面这三种我都没有讲到,因为用了它们事务是不会发生回滚,加了等于没加。

3、@Transactional 注解属性 rollbackFor 设置错误,这个上面演示给大家看了,默认的只会对 RuntimeException 类型和 Error 类型的才进行回滚。如果在事务中抛出其他类型的异常,却希望 Spring 能够回滚事务,就需要指定 rollbackFor 属性。

4、同一个类中方法调用,导致 @Transactional 失效。这个我在上面做实验的时候已经演示过了,总方法调子方法的时候,要放在不同的 service 里面,如果放在一个类里面,事务调用是不会生效的。

5、异常被吃了,这个在实验五里面也说了,吃掉以后虽然不影响其他事务,但是其他数据的 commit 会造成数据不一致,所以有些时候 try catch 反倒会画蛇添足。

6、数据库引擎不支持事务,这一点很简单,myisam 引擎是不支持事务的,innodb 引擎支持事务。

7、数据源没有配置事务管理器,这个也很简单,要使用事务肯定要配事务管理器。Hibernate 用的是HibernateTransactionManager,JDBC 和 Mybatis 用的是 DataSourceTransactionManager。

8、最后就是一个方法内多数据库(多数据源)的情况下会失效,这个也是我同事做实验得出来的。

好的文章链接:

你真的会用@Transactional吗?

说明:该文章通过示例讲解了每一种使用情况,包括正常和异常情况,非常的容易理解。

有关Spring事务,看这一篇就足够了https://blog.csdn.net/y277an/article/details/91410696

说明:总结性质的,方便记忆

Spring源码深度解析(一)—事务管理

说明:核心就是AOP,动态代理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值