什么是事务的传播特性
事务的传播特性,指的是:一个子事务方法运行在另一个事务方法中,这个子事务方法该如何进行?如:子事务方法可能在父事务中运行,也可能开启一个新的事务,并在自己的事务中运行。
@Service
public class AccountService {
@Transactional
public void laoda(){
System.out.println("老大的方法");
xiaodi();
//老大方法出现异常,老大回滚,小弟的方法需要回滚么?
}
@Transactional
public void xiaodi(){
System.out.println("小弟的方法");
//小弟方法出现异常,小弟回滚,老大的方法需要回滚么?
}
}
spring七种传播特性:
传播特性 | 说明 |
---|---|
PROPAGATION_REQUIRED | 默认事务类型。如果当前没有事务,就新建自己的事务,并在自己的事务中运行;如果有,就运行在当前事务中 |
PROPAGATION_REQUIRES_NEW | 无论如何需要自己的事务。如果当前没有事务,就新建自己的事务,并在自己的事务中运行;如果有,则将当前事务挂起,运行自己的事务 |
PROPAGATION_NESTED | 如果当前没有事务,就新建一个事务并运行在自己的事务中;如果有,就在当前事务中的嵌套事务内运行。 |
PROPAGATION_SUPPORTS | 如果没有,就以非事务方式执行;如果有,就使用当前事务 |
PROPAGATION_MANDATORY | 当前方法必须运行在事务内部。如果当前没有事务,就抛出异常 |
PROPAGATION_NEVER | 当前的方法不应该运行在事务中。如果有运行的事务,就抛出异常 |
PROPAGATION_NOT_SUPPORTED | 如果当前没有事务,就以非事务方式执行;如果有,就将当前事务挂起。即以非事务状态运行,不加入到事务中 |
默认是PROPAGATION_REQUIRED
public @interface Transactional {
...
Propagation propagation() default Propagation.REQUIRED;
...
}
测试代码 待完善!!!!
子事务的传播特性为Propagation.REQUIRED+运行时异常+抛出异常
子事务的传播特性为Propagation.REQUIRED+运行时异常+不抛出异常
父事务运行时异常+抛出异常
父事务运行时异常+不抛出异常
子事务的传播特性为Propagation.REQUIRED+编译型异常+抛出异常
子事务的传播特性为Propagation.REQUIRED+编译型异常+不抛出异常
父事务编译型异常+抛出异常
父事务编译型异常+不抛出异常
子事务的传播特性为Propagation.REQUIRED,则子事务的timeout等事务属性不起作用了,需要看父事务的事务属性
https://blog.youkuaiyun.com/c_ajing/article/details/106054265
已经完成的PROPAGATION_REQUIRES_NEW事务不会回滚。
原理:
REQUIRED:将父事务用的connection传递给子事务使用
REQUIRES_NEW:新创建了connection
spring事务什么情况下不起作用
1. try-catch了异常
2. 在类中内部调用,这个时候会用this关键字.
导致没有通过代理去走此方法,从而没有开启事务.即调用方法的对象不是aop代理对象
4. 被@Transactional 注解修饰的方法, 修饰符非public 或者被final修饰. Aop没办法为其生成一个代理