- 如果同类A方法调用B方法有事务,如果不手动回滚会导致回滚失败。
- 正确的做法是建个类将B方法写到新类,通过spring来管理,就可以做到事物的传播性来实行自动回滚。
- 如果一定需要在本类实现回滚,那么就需要手动回滚事物,如下:
@Transactional(rollbackFor = Exception.class)
public String deleteUser(Long userId){
//catch deleteUserWife的异常
try {
userMapper.deleteUserById(userId);
} catch (Exception e) {
//手动回滚deleteUserById
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//这个异常是统一处理返回信息的,不需理会。
throw new AddException();
}
return "删除成功。";
}
@Transactional(rollbackFor = Exception.class)
public String deleteUserWife(Long wifeId){
if (userMapper.deleteUserWifeById(wifeId) <= 0) {
log.warn("删除用户:删除用户妻子:失败。");
//这里抛出删除异常。
throw new DelException();
}
return "删除成功。";
}