Spring事务回滚总结

本文详细解释了Java中UserService中的@Transactional注解的各种传播行为,包括REQUIRED,REQUIRES_NEW,NESTED等在无事务和已有事务情况下的执行逻辑,以及不同方法调用之间的事务处理规则。
@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都不抛异常,都正常提交
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值