public void A(a) {
insertAtoTable(a);
}
public void B(b) {
insertBtoTable(b);
}
1.required:如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务
@Transactional(propagation = Propagation.REQUIRED)
public void testMain() {
A(a);
testb();
}
@Transactional(propagation = Propagation.REQUIRED)
pubic void testb() {
B(b1);
throw new Exception();
B(b2)
}
结果:因为testMain()存在事务,所以执行testb()时就会加入该事务,因此AB是同一事务,发生异常后回滚。都没有插入成功
public void testMain() {
A(a);
testb();
}
@Transactional(propagation = Propagation.REQUIRED)
pubic void testb() {
B(b1);
throw new Exception();
B(b2)
}
结果:a更新成功,b1,b2更新失败.由于testMain()中没有声明事务,,testb有声明事务,且传播机制是REQUIRED,所以在执行testb时会新建一个事务,该事务发生了回滚。但a不会回滚
SUPPORTS:当前存在事务,则加入该事务,如果没有就以非事务方式执行。
public void testMain() {
A(a);
testb();
}
@Transactional(propagation = Propagation.SUPPORT)
pubic void testb() {
B(b1);
throw new Exception();
B(b2)
}
结果:a,b1更新成功,b2更新失败,因为当前不存在事务,所以以非事务方式执行。
MANDATORY:当前存在事务,则加入该事务,如果当前事务不存在,则抛出异常。
public void testMain() {
A(a);
testb();
}
@Transactional(propagation = Propagation.MANDATORY)
pubic void testb() {
B(b1);
throw new Exception();
B(b2)
}
结果:a更新成功,b1,b2失败,因为运行到该方法时就报错了,不存在事务回滚。
REQUIRES_NEW:创建一个新事务,如果存在当前事务,则挂起该事务
@Transactional(propagation = Propagation.REQUIRED)
public void testMain() {
A(a);
testb();
throw new Exception();
}
@Transactional(propagation = Propagation.REQUIRED_NEW)
pubic void testb() {
B(b1);
B(b2)
}
结果:a没有存储成功,b1,b2存储成功,testb会开启一个新的事务,testMain中事务会发生回滚,两个事务互不影响。
如果两个都是REQUIRED,a,b1,b2都会更新失败,因为只有一个事务,并且发生异常.
NOT_SUPPORTED:始终以非事务方式进行,如果当前有事务,则挂起
@Transactional(propagation = Propagation.REQUIRED)
public void testMain() {
A(a);
testb();
}
@Transactional(propagation = Propagation.NOT_SUPPORTED)
pubic void testb() {
B(b1);
throw new Exception();
B(b2)
}
结果:a,b2没有更新成功,b1存储成功,因为b没有事务,所以b1存储成功,但是b1抛出了异常,影响了a事务,因此a回滚,没有更新成功
NEVER:不使用事务,如果当前存在抛出异常,不仅我这个方法不允许使用事务,并且调用我的方法也不允许存在事务,如果调用我的方法存在事务,抛出异常
NESTED:如果当前存在事务,则以嵌套事务方式执行,如果不存在事务,则创建一个新的事务。嵌套事务是一种特殊事务,独立于外部事务进行回滚,但提交仍依赖于外部事务。这种传播行为适用于需要在单个事务内执行多个独立操作的场景。