//一定要加 rollbackFor = Exception.class 参数
@Transactional(rollbackFor = Exception.class)
如果在写代码时候只加上@Transaction
这样的设置其实是存在问题的:
场景1:
@Override
@Transactional
public void AddUserException() {
User user=new User();
user.setUniqueCode(UUIDGenerator.getUUID());
user.setUsername("test");
user.setPassword("passwd");
user.setMobile("110119111");
userDao.insert(user);
int i=1/0;
}
实验结果:
抛出 / by zero,事务回滚成功
场景2:
@Override
@Transactional
public void AddUserException() throws FileNotFoundException {
User user=new User();
user.setUniqueCode(UUIDGenerator.getUUID());
user.setUsername("test");
user.setPassword("passwd");
user.setMobile("110119111");
userDao.insert(user);
int i=1/0;
FileInputStream fis = new FileInputStream("Users/lli/a.txt");
}
实验结果:
抛出异常java.io.FileNotFoundException,事务并未回滚
具体原因:使用@Transaction 时默认为RuntimeException(也就是运行时异常)异常才会回滚。
异常分为检查异常,和非检查异常(也就是运行时异常)。
检查异常例如IOException异常等,在你写代码时编译提示你必须try catch 或向上抛,反正就是必须处理。
而运行时异常,就是在运行时的产生异常,例如/by zero异常。
所以当我们上面实验抛出java.io.FileNotFoundException检查异常时导致了数据的不回滚。
解决方法:添加事务@Transactional(rollbackFor = Exception.class) 不管检查异常还是非检查异常都会回滚。