首先,让我们先来看如下代码段:
@Transactional
public void delete(Function function) throws Exception {
functionMapper.delete(function); // 从数据库中删除数据
throw new Exception("我是异常,我要触发事务回滚!");
}
逻辑很简单,方法上加了 @Transactional 注解,就是想要在抛出 Exception 的时候触发「数据库事务回滚」,但是结果会如愿吗?
答案是:当然不会!!!!
为什么会这样呢?我不是已经在方法上加了 @Transactional 注解吗?
之所以会这样,是因为在默认情况下被 @Transactional 注解修饰的方法内只有抛出 RuntimeException 及其子类、Error 的情况才会触发「数据库事务回滚」。而上边的代码段中抛出的是 Exception,不符合条件所以未能触发「数据库事务回滚」。
那要想让抛出 Exception 也触发「数据库事务回滚」该怎么办呢?
方法也很简单,我们只需要指定 @Transactional 注解中的 rollbackFor 属性就可以了,如下:
@Transactional(rollbackFor = Exception.class)
public void delete(Function function) throws Exception {
functionMapper.delete(function); // 从数据库中删除数据
throw new Exception("我是异常,我要触发事务回滚!");
}
这样就 OK 了。