Propagation.NESTED Propagation.REQUIRED Propagation.REQUIRES_NEW
主要说这三种传播类型
场景1 :
事务方法a 调用事务方法b和c
void a(){
otherClass.b();
try{
otherClass.c();
}catch(Exception c)
}
void c(){
throw new RunTimeException("an exception")
}
注意不能调用本类的事务方法,因为如果采用this.b()的方式,事务会失效
a的事务类型不变 一直是 Propagation.REQUIRED
b的事务类型是:Propagation.REQUIRED
1.1 如果事务c类型是Propagation.REQUIRED 结果 :事务b 事务c 均执行失败
1.2 如果事务c类型Propagation.REQUIRES_NEW 结果:事务b执行成功 c失败
1.3 如果事务c类型Propagation.NESTED结果:事务b执行成功 c失败
场景2 :
事务方法a 调用事务方法b和c
void a(){
otherClass.b();
otherClass.c();
throw new RunTimeException("an exception")
}
a b 的事务类型不变 一直是 Propagation.REQUIRED
2.1 如果事务c类型是Propagation.REQUIRED 结果 :b c 均失败
2.2 如果事务c类型Propagation.REQUIRES_NEW 结果:b失败 c执行成功
2.3 如果事务c类型Propagation.NESTED 结果:b和c均失败
从结果中分析:
Propagation.REQUIRED:此类会把事务方法传播到子方法中,不管子类有没有事务,他们都会成为一个事务
Propagation.REQUIRES_NEW 此类不受外围方法的影响,他是独立的 闭关锁国
Propagation.NESTED 此类是两者的结合。其实就是又想独立 又想被外围事务影响。其实就是 如果此类抛出异常,不会影响外围事务,如果外围事务抛出异常 会影响到子事务,应用场景大概就是 比如我想记录一个事务的业务日志,记录业务日志呢 又不影响业务,所以如果在记录日志时发生异常,我当然不希望它会造成业务回滚。如果业务出现异常,记录业务日志也没用意义,所以让业务日志也进行回滚。
希望大家多多补充 以上代码只是伪代码