@Service
public class UserService {
@Transactional(propagation = Propagation.REQUIRED)
public void test1() {
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void test2() {
}
@Transactional(propagation = Propagation.NESTED)
public void test3() {
}
}
/**
* 总结: 1. 在没有事务的情况下REQUIRED,REQUIRES_NEW,NESTED的传播行为下,如果没有事务,都会开启一个新事务
* PROPAGATION_MANDATORY则会抛出异常,在其他的情况下,不会创建事务,只会进行同步回调信息
* 2. 在已经存在事务的情况
* PROPAGATION_NEVER则会抛出异常,PROPAGATION_NOT_SUPPORTED会暂停已存在的事务
* PROPAGATION_REQUIRES_NEW则会继续新建一个事务,PROPAGATION_NESTED则会创建保存点,使用已存在的事务
* 其他情况下,都是使用已存在的事务
* <p>
* 如果在有事务的情况下
* 前提:本类方法调用都用代理对象,而不是用this调用
* 1. 当test1中调用test2 (1,2)
* 1.1 如果test1抛出异常,test2不抛出异常,则test2事务提交,test1事务回滚
* 1.2 如果test2抛出异常,test1不抛出异常,则test2事务回滚,test1事务回滚
* 1.3 如果test1和test2都抛异常,那都回滚
* 1.4 如果test1和test2都不抛异常,都正常提交
* <p>
* 2. 当test2中调test1 (2,1)
* 2.1 如果test1抛出异常,test2不抛出异常,则test2事务回滚,test1事务回滚
* 2.2 如果test2抛出异常,test1不抛出异常,则test2事务回滚,test1事务回滚
* 2.3 如果test1和test2都抛异常,那都回滚
* 2.4 如果test1和test2都不抛异常,都正常提交
* <p>
* 3. 当test1中调test3 (1,3)
* 3.1 如果test1抛出异常,test3不抛出异常,则test1事务回滚,test3事务回滚
* 3.2 如果test3抛出异常,test1不抛出异常,则test3事务回滚,test1事务回滚
* 3.3 如果test1和test3都抛异常,那都回滚
* 3.4 如果test1和test3都不抛异常,都正常提交
* <p>
* 4. 当test3中调test1 (3,1)
* 4.1 如果test1抛出异常,test3不抛出异常,则test1事务回滚,test3事务回滚
* 4.2 如果test3抛出异常,test1不抛出异常,则test3事务回滚,test1事务回滚
* 4.3 如果test1和test3都抛异常,那都回滚
* 4.4 如果test1和test3都不抛异常,都正常提交
* <p>
* 5. 当test2中调test3 (2,3)
* 5.1 如果test2抛出异常,test3不抛出异常,则test2事务回滚,test3事务回滚
* 5.2 如果test3抛出异常,test2不抛出异常,则test3事务回滚,test1事务回滚
* 5.3 如果test2和test3都抛异常,那都回滚
* 5.4 如果test2和test3都不抛异常,都正常提交
* <p>
* 6. 当test2中调test3 (3,2)
* 6.1 如果test2抛出异常,test3不抛出异常,则test2事务回滚,test3事务回滚
* 6.2 如果test3抛出异常,test2不抛出异常,则test2事务提交,test3事务回滚
* 6.3 如果test2和test3都抛异常,那都回滚
* 6.4 如果test2和test3都不抛异常,都正常提交
*/