事务回滚方法调用非事务回滚方法,如果非回滚方法发生异常, 非回滚方法里执行的持久化操作会被回滚吗 ?
1. 会被混滚
2,但是指定不会滚的异常类型,就可以避免发生回滚
看代码:
@Transactional(rollbackFor = Exception.class)
public void test() {
TbLog log = new TbLog();
log.setId("3");
log.setOperationContent("事物回滚测试:有回滚注解");
tbLogService.create(log);
test1();
}
private void test1(){
for (int i = 1; i <3 ; i++) {
if (i==2){
throw new RestClientException("事物回滚测试");
}
TbLog log = new TbLog();
log.setId(String.valueOf(i));
log.setOperationContent("事物回滚测试:没注解");
tbLogService.create(log);
}
}
事物回滚方法 test() 调用了不回滚方法test1() , test1()方法会抛出RestClientException异常,测试发现:抛异常后之前所有的持久化操作都发生了回滚;
在做测试:
下面在test()方法的事务里添加不会滚的异常类型RestClientException , 经测试不会发生回滚, 所以你如果想不让他回滚, 可以在事务里指定不回滚的类型, 在不想发生回滚的方法把全部会发生异常的地方,全部抛出指定类型异常就不会,如:RestClientException,就可以避免回滚;
@Override
@Transactional(rollbackFor = Exception.class,noRollbackFor = RestClientException.class)
public void test() {
TbLog log = new TbLog();
log.setId("3");
log.setOperationContent("事物回滚测试:有回滚注解");
tbLogService.create(log);
test1();
}
private void test1(){
for (int i = 1; i <3 ; i++) {
if (i==2){
throw new RestClientException("事物回滚测试");
}
TbLog log = new TbLog();
log.setId(String.valueOf(i));
log.setOperationContent("事物回滚测试:没注解");
tbLogService.create(log);
}
}
这种方法要求test方法调用Spring代理类的test01方法. 就是不能放在一个类里面,需要定义在另一个类里面 并注册进Spring容器
@Override
@Transactional(rollbackFor = Exception.class)
public void test() {
TbLog log = new TbLog();
log.setId("3");
log.setOperationContent("事物回滚测试:有回滚注解");
tbLogService.create(log);
test1();
}
//挂起事务
@Transactional(propagation = Propagation.NOT_SUPPORTED)
private void test1(){
for (int i = 1; i <3 ; i++) {
if (i==2){
throw new RestClientException("事物回滚测试");
}
TbLog log = new TbLog();
log.setId(String.valueOf(i));
log.setOperationContent("事物回滚测试:没注解");
tbLogService.create(log);
}
}