Spring事务细节【回滚设置】:rollbackFor + noRollbackFor

概念

rollbackFor :哪些异常需要回滚
noRollbackFor :哪些异常可以不回滚

异常分类:
在这里插入图片描述

  1. 运行时异常(RuntimeException):默认都回滚。 int a=1/0
  2. 编译时异常(RuntimeException以外的异常):默认不回滚。 throw IOException
    注:
    在@Transactional注解中如果不配置rollbackFor属性,那么事务只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事务在遇到非运行时异常时也回滚

测试代码(不涉及传播行为)

1. noRollbackFor :让运行时异常抛出时不回滚

@Transactional(noRollbackFor = {ArithmeticException.class})
public void changeNum(){
    testAMapper.addNumA();    
    int a = 1/0;  //运行时异常,正常会导致回滚;noRollbackFor 加上后不回滚,使得test_a表的a:10-->11,test_b表的b依旧是10
    testBMapper.descNumB();
}

2. 运行时异常被try-catch,noRollbackFor 不起作用,事务正常进行

@Transactional(noRollbackFor = {ArithmeticException.class})
public void changeNum(){
    testAMapper.addNumA();  //a:10-->11
    try {
        int a = 1/0;
    }
    catch (Exception e){}
    testBMapper.descNumB();  //b:10-->9
} 

3. rollbackFor:让编译型异常抛出时也能回滚事务
不加rollbackFor :

@Transactional()
public void changeNum() throws FileNotFoundException {
    testAMapper.addNumA();    //a:10-->11  非运行时异常,默认不回滚
    new FileInputStream("E://a.txt");
    testBMapper.descNumB();  //b:10-->10
}

加rollbackFor :

@Transactional(rollbackFor = {FileNotFoundException.class})
public void changeNum() throws FileNotFoundException {
    testAMapper.addNumA();   //a:10-->10
    new FileInputStream("E://a.txt");
    testBMapper.descNumB();  //b:10-->10
}

4. 非运行时异常被try-catch,rollbackFor 不起作用,事务正常进行

@Transactional(rollbackFor = {FileNotFoundException.class})
public void changeNum()  {
    testAMapper.addNumA();  //a:10-->11
    try {
        new FileInputStream("E://a.txt");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    testBMapper.descNumB();  //b:10-->9
}

版权声明:本文为weixin_43283513原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。