1、问题:
在项目中使用了@Transactional注解,如下:
/**
* 非运行时异常默认事务不回滚
* @throws Exception
*/
@Transactional
public void insert() throws Exception {
try {
UserInfo userInfo = new UserInfo();
userInfo.setName("test");
userInfo.setAge(14);
userDao.insert(userInfo);
} catch (HttpException e) {
throw new Exception(); //抛出非运行时异常 默认情况下不回滚,事务------->不回滚
}
}
当insert操作出现异常时,事务并没有回滚,
2、原因:
查看@Transactional源码:
默认情况下只有是RuntimeException或者Error才会回滚,而Exception是RuntimeException的父类,并不会回滚。
3、解决办法:
添加@Transactional(rollbackFor=Exception.class),指定回滚的异常。
/**
* 添加(rollbackFor=Exception.class)
* @throws Exception
*/
@Transactional(rollbackFor=Exception.class)
public void insert() throws Exception {
try {
UserInfo userInfo = new UserInfo();
userInfo.setName("test");
userInfo.setAge(14);
userDao.insert(userInfo);
} catch (HttpException e) {
throw new Exception(); //抛出非运行时异常 也会捕获并且回滚,事务------->回滚
}
}