spring事务问题二

spring事务问题二

有一类如下 ,问事务执行情况:

class UserMgr{

    @Transactional
    public void method3(){
        //插入操作1
       method4();
    }

    @Transactional
    public void method4(){
       //插入操作2
        throw new RuntimeException("异常了!");
    }

}

**结果,显然,method3 和 method4 都回滚,即插入操作1和操作2不能插入 **

情况二 在method3中的 method4上进行try-catch

即:

class UserMgr{

    @Transactional
    public void method3(){
        //插入操作1
     try {
            method4();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Transactional
    public void method4(){
       //插入操作2
        throw new RuntimeException("异常了!");
    }

}

结果,插入操作1和操作2都插入成功,原因是spring事务认为异常已经被处理,即能正常执行插入操作。即使事务传播方式由默认的 required 换成 required_new, 操作1和操作2也能会正常插入

情况三 将method4抽成其他类中的方法调用


class CserMgr{

    @Transactional
    public void method4(){
       //插入操作2
        throw new RuntimeException("异常了!");
    }

}


class UserMgr{

    @Transactional
    public void method3(){
        //插入操作1
        CserMgr.method4();

    }

    @Transactional
    public void method4(){
       //插入操作2
        throw new RuntimeException("异常了!");
    }

}

结果就是,插入操作1和操作2都进行了回滚,事务有效。即使将传播方式由默认的 required 换成 required_new ,也是同样的数据会回滚

情况四 将CserMgr.method4 进行 try-catch

class UserMgr{

    @Transactional
    public void method3(){
        //插入操作1
        try {
            CserMgr.method4();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Transactional
    public void method4(){
       //插入操作2
        throw new RuntimeException("异常了!");
    }

}

结果就是,插入操作1 和操作2都没有插入成功,并且报出一个rollback-only异常:

org.springframework.transaction.UnexpectedRollbackException:
 Transaction rolled back because it has been marked as rollback-only


大概意思是事务已经被标记成功 rollback-only, 在最外层的事务在commit 的时候只能进行 rollback 操作,故数据未插入成功

在这个情况下,将默认的传播方式 required 换成 required_new时,发现插入操作1能正常进行数据插入, 操作2的数据进行了回滚

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页