记录一次Spring注解式事务无法回滚问题

遇到问题:使用Spring注解式事务时,在事务中调用了两个方法,在方法二中出现了异常,方法一未回滚

原因:在开启事务的方法中如果使用了try catch 处理异常,则事务不回滚

@Override
@Transactional
public void testMethodOne() {
User user = new User();
user.setUserName("zhangsan");
user.setUserSex("男");
user.setScore(20);
try {
addUser(user);
user.setScore(80);
updateUser(user);
} catch (Exception e) {
e.printStackTrace();
}
}

private void addUser(User user) throws RuntimeException {
userDao.saveUserInfo(user);
throw new RuntimeException("添加用户错误");
}

private void updateUser(User user) {
userDao.updateUserInfo(user);
}
结果:事务不回滚

===========================================
解决方案1:在catch块中回滚事务也能正常回滚事务

@Override
@Transactional
public void testMethodOne() {
User user = new User();
user.setUserName("zhangsan");
user.setUserSex("男");
user.setScore(20);
try {
addUser(user);
user.setScore(80);
updateUser(user);
} catch (Exception e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
结果:事务正常回滚
=======================================================
解决方案2:去掉try catch

@Override
@Transactional
public void testMethodOne() {
User user = new User();
user.setUserName("zhangsan");
user.setUserSex("男");
user.setScore(20);
addUser(user);
user.setScore(80);
updateUser(user);
}

private void addUser(User user) throws RuntimeException {
userDao.saveUserInfo(user);
throw new RuntimeException("添加用户错误");
}

private void updateUser(User user) {
userDao.updateUserInfo(user);
}

结果:事务可正常回滚
posted @ 2020-08-08 18:01  初级小兵  阅读(228)  评论(0)    收藏  举报