首先,我们必须知道,默认spring事务只在发生未被捕获的 runtimeexcetpion时才会被spring aop异常捕获从而 回滚。
try…catch就是捕获异常,然后处理掉,事务是不会回滚的;
@transactional 是要在系统抛异常的时候才能起到事务回滚的作用;
@Transactional(rollbackFor = Exception.class)
@Override
public Integer updateRecordOrdeNo(User user) {
Integer flag = 0;
try{
flag = userMapper.save(user); // 表操作
//出现异常
1/0;
} catch (Exception e) {
logger.info("异常:"+e);
}
}
//此时return语句能够执行
return flag;
}
此时,事务是不会回滚的
解决try…catch事务回滚问题
###方法一:设置手动回滚
org.springframework.transaction.interceptor包下的类
TransactionAspectSupport.currentTransactionStatus()
.setRollbackOnly();
@Transactional(rollbackFor = Exception.class)
@Override
public Integer updateRecordOrdeNo(User user) {
Integer flag = 0;
try{
flag = userMapper.save(user);
//出现异常
1/0;
} catch (Exception e) {
logger.info("异常:"+e);
//设置手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
//此时return语句能够执行
return flag;
}
方法二:catch中抛出运行时异常
把异常抛出,就会被spring aop异常捕获到。
@Transactional(rollbackFor = Exception.class)
@Override
public Integer updateRecordOrdeNo(User user) {
Integer flag = 0;
try{
flag = userMapper.save(user);
//出现异常
1/0;
} catch (Exception e) {
logger.info("异常:"+e);
//catch中抛出运行时异常
throw new RuntimeException();
}
}
//此时return语句能够执行
return flag;
}