public class ServiceA {
@Autowired
private ServiceB b;
@Transactional
public void method() {
// 数据库操作
b.methodB();
}
}
public class ServiceB {
@Transactional
public void method() throws Exception {
//数据库操作
}
}
**PROPAGATION_REQUIRED:**默认,如果ServiceA.method调用了ServiceB.method,如果ServiceA.method开启了事务,然后ServiceB.method也声明了事务,那么ServiceB.method不会开启独立事务,而是将自己的操作放在ServiceA.method的事务中来执行,ServiceA和ServiceB任何一个报错都会导致整个事务回滚。
**PROPAGATION_SUPPORTS:**如果ServiceA.method开了事务,那么ServiceB就将自己加入ServiceA中来运行,如果ServiceA.method没有开事务,那么ServiceB自己也不开事务。
**PROPAGATION_MANDATORY:**必须被一个开启了事务的方法来调用自己,否则报错。
**PROPAGATION_REQUIRES_NEW:**ServiceB.method强制性自己开启一个新的事务,然后ServiceA.method的事务会卡住,等ServiceB事务完了自己再继续。这就是影响的回滚了,如果ServiceA报错了,ServiceB是不会受到影响的,ServiceB报错了,ServiceA也可以选择性的回滚或者是提交。
**PROPAGATION_NOT_SUPPORTED:**就是ServiceB.method不支持事务,ServiceA的事务执行到ServiceB那儿,就挂起来了,ServiceB用非事务方式运行结束,ServiceA事务再继续运行。这个好处就是ServiceB代码报错不会让ServiceA回滚。
**PROPAGATION_NEVER:**不能被一个事务来调用,ServiceA.method开事务了,但是调用了ServiceB会报错
**PROPAGATION_NESTED:**开启嵌套事务,ServiceB开启一个子事务,如果回滚的话,那么ServiceB就回滚到开启子事务的这个save point。