概念:
rollbackFor :哪些异常需要回滚
noRollbackFor :哪些异常可以不回滚
异常分类:
运行时异常(RuntimeException):默认都回滚。 int a=1/0
编译时异常(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
}