Spring事务传播

事务失效场景

其实就是AOP注解失效的场景

  • 方法用final修饰,导致无法代理

  • 方法内部调用,无注解方法调用有注解方法会失效。可以注入自己的类再去调用

  • 未被Spring管理

  • 方法不是public修饰符(源码判断必须是public才行)

  • 手动捕获异常并不抛出

事务类型

  • 扁平事务(Flat Transactions)
  • 带有保存点的扁平事务(Flat Transactions with Savepoints)
  • 链事务(Chained Transactions)
  • 嵌套事务(Nested Transactions)
  • 分布式事务(Distributed transactions)

带保存点的扁平事务可以模拟嵌套事务,灵活性比较高。但是无法像嵌套事务可以并行执行子事务。

传播机制

  • propagation_required:默认传播行为。方法被调用时,存在事务则加入,没有则创建
  • propagation_supports:存在事务则加入,没有则不创建事务
  • propagation_mandatory:存在事务则加入,没有则抛出异常
  • propagation_requires_new:创建一个新的事务,调用方的事务被挂起至当前事务执行完。
  • propagation_not_supported:当前方法不以事务方式运行,调用方存在事务则挂起调用方事务,然后以非事务方式运行当前方法。
  • propagation_never:当前方法不以事务方式运行,调用方存在事务则抛出异常
  • propagation_nested:如果调用方存在事务,则会当前方法按嵌套事务方式运行,可以单独提交或者回滚。调用方不存在事务则创建一个事务。

分三类:

  1. 支持当前事务,如果当前有事务,那么会加入该事务,不再单独创建事务。如果当前没有事务,则分为三种情况
    • 创建事务
    • 不按事务执行
    • 抛出异常
  2. 不支持当前事务,分为三种情况。
    • 自己会创建事务,允许当前存在事务。当前存在事务则挂起,运行自己的事务
    • 自己不会创建事务,允许当前存在事务。当前存在事务则挂起,以非事务方式运行自己
    • 自己不会创建事务,不允许当前存在事务。当前存在事务则抛出异常
  3. 嵌套方式,当前存在事务则创建嵌套的子任务。

总结:
三类事务:加入、挂起、嵌套
四种对调用方事务的响应:没有则创建、没有则不创建、没有则抛出异常、有则抛出异常

参考

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值