事务传播定义
方法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再变成小写来看看:
- required
Requires_new - Mandatory
never - Support
not_support - Nest
除了nest两两对应就好记很多啦