Spring 事务的传播机制,看这篇就够了!

点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

You will meet two kinds of people in life: ones who build you up and ones who tear you down. But in the end, you'll thank them both.

生命中你会遇到两种人:一种是鼓励你的人,一种是打击你的人,最终,这两者都要感谢。


每日掏心话

给生活一个微笑,给自己一个微笑,路还是要继续走。春有春的温暖,夏有夏的火热,秋有秋的收获,冬有冬的寒冷,学会享受生活!


来自:Janti | 责编:乐乐

链接:cnblogs.com/superfj/p/8667977.html

640?wx_fmt=jpeg

程序员小乐(ID:study_tech)第 677 次推文   图片来自网络




   正文   


事务对于 java web 应用来说,也是比较大的一方面。面试的时候也会经常的问到,包含的内容有:

  • 事务的四大特性

  • 事务的隔离级别

  • spring 事务的传播机制

预期读者

对事务有一定基础的同学,想弄清楚 spring 事务的传播机制

为什么会有传播机制

spring 对事务的控制,是使用 aop 切面实现的,我们不用关心事务的开始,提交 ,回滚,只需要在方法上加 @Transactional 注解,这时候就有问题了。

  • 场景一:serviceA 方法调用了 serviceB 方法,但两个方法都有事务,这个时候如果 serviceB 方法异常,是让 serviceB 方法提交,还是两个一起回滚。

  • 场景二:serviceA 方法调用了 serviceB 方法,但是只有 serviceA 方法加了事务,是否把 serviceB 也加入 serviceA 的事务,如果 serviceB 异常,是否回滚 serviceA 。

  • 场景三:serviceA 方法调用了 serviceB 方法,两者都有事务,serviceB 已经正常执行完,但 serviceA 异常,是否需要回滚 serviceB 的数据。

传播机制生效条件

因为 spring 是使用 aop 来代理事务控制 ,是针对于接口或类的,所以在同一个 service 类中两个方法的调用,传播机制是不生效的

传播机制类型

下面的类型都是针对于被调用方法来说的,理解起来要想象成两个 service 方法的调用才可以。

PROPAGATION_REQUIRED (默认)

  • 支持当前事务,如果当前没有事务,则新建事务

  • 如果当前存在事务,则加入当前事务,合并成一个事务

REQUIRES_NEW

  • 新建事务,如果当前存在事务,则把当前事务挂起

  • 这个方法会独立提交事务,不受调用者的事务影响,父级异常,它也是正常提交

NESTED

  • 如果当前存在事务,它将会成为父级事务的一个子事务,方法结束后并没有提交,只有等父事务结束才提交

  • 如果当前没有事务,则新建事务

  • 如果它异常,父级可以捕获它的异常而不进行回滚,正常提交

  • 但如果父级异常,它必然回滚,这就是和 REQUIRES_NEW 的区别

SUPPORTS

  • 如果当前存在事务,则加入事务

  • 如果当前不存在事务,则以非事务方式运行,这个和不写没区别

NOT_SUPPORTED

  • 以非事务方式运行

  • 如果当前存在事务,则把当前事务挂起

MANDATORY

  • 如果当前存在事务,则运行在当前事务中

  • 如果当前无事务,则抛出异常,也即父级方法必须有事务

NEVER

以非事务方式运行,如果当前存在事务,则抛出异常,即父级方法必须无事务

一点小说明

一般用得比较多的是 PROPAGATION_REQUIRED , REQUIRES_NEW;

REQUIRES_NEW 一般用在子方法需要单独事务,暂时找不到例子,以后补充 。

完整的演示程序

gitee.com/sanri/example/tree/master/test-mybatis

640?wx_fmt=png

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

猜你还想看



640?wx_fmt=png

关注微信公众号「程序员小乐」,收看更多精彩内容
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值