spring事务传播机制

事务传播定义

方法A中用到了方法B,然后在方法A中使用方法B时,事务形式的变化就是事务传播(听起来太抽象了还是直接看下下面的🌰吧)

事务传播类型

PROPAGATION_REQUIRED

B在A中被调用

  • 如果A不是事务,就新创建一个事务来执行B
  • 如果A是事务,就直接在A事务本身中执行
PROPAGATION_REQUIRES_NEW

B在A中被调用,不管A本身是不是事务,都必须创建一个新的事务来执行B

PROPAGATION_MANDATORY

mandatory意思如下,强制嘛
在这里插入图片描述
也就是说B必须在一个事务中运行。如果A不是事务并调用了B,就抛出异常

PROPAGATION_NEVER

A的事务级别是PROPAGATION_REQUIRED
B的事务级别是PROPAGATION_NEVER
那么A调用B的时候就要抛出异常了

PROPAGATION_SUPPORTS

B对自己没什么要求
A是事务B就以事务形式运行
A不是事务B就以非事务形式运行
就相当于B对A说“我听你的”

PROPAGATION_NOT_SUPPORTED

B不支持事务。

比如
A的事务级别是PROPAGATION_REQUIRED
B的事务级别是PROPAGATION_NOT_SUPPORTED
那么当执行到methodB时,methodA的事务挂起,而methodB以非事务的状态运行完,再继续methodA的事务。

和never很像有木有
区别是
这个never比较强硬,直接抛出异常
这个not_support比较温柔,还可以挂起一段时间
PROPAGATION_NESTED

理解Nested的关键是savepoint。

他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立,
而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。
而Nested事务的好处是他有一个savepoint。

ServiceA {
/*** 事务属性配置为 PROPAGATION_REQUIRED*/void methodA() {
  try {
    //savepoint
    ServiceB.methodB(); 
    //PROPAGATION_NESTED 级别
  } catch (SomeException) {
    // 执行其他业务, 如 ServiceC.methodC();
  }
}
}

总结

全部看完就可能感觉有点难记
我的建议是不要管前面的propagation再变成小写来看看:

  1. required
    Requires_new
  2. Mandatory
    never
  3. Support
    not_support
  4. Nest

除了nest两两对应就好记很多啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值