Spring事务的坑你遇到过几个
有的小伙伴在开发过程中在Service方法上面加了一个@Transactional注解,就认为事务已经启动了,是真的吗?
下面列出代码片段,所有的坑事务都不好使,不信你试试。
完整代码获取gitee
坑一:调用私有方法
/**
* 调用私有方法,事务不好使
*/
public void saveUserCallPrivate() {
saveUserPrivate();
}
@Transactional()
private void saveUserPrivate(){
userMapper.insert(createUser());
throw new RuntimeException("saveUserPrivate");
}
坑二:调用this方法
/**
* 调用this.方法 事务也是不好用的
*/
public void saveUserCallThis() {
this.saveUserThis();
}
@Transactional()
public void saveUserThis(){
userMapper.insert(createUser());
throw new RuntimeException("saveUserThis");
}
坑二解决办法
@Autowired
private TransactionService self;
/**
* 这回就好使了
*/
public void saveUserCallSelf() {
self.saveUserThis();
}
@Transactional()
public void saveUserSelf(){
userMapper.insert(createUser());
throw new RuntimeException("saveUserSelf");
}
坑三:try-catch后,事务不好使
/**
* try-catch 后 事务不好使
*/
@Transactional()
public void saveUserWithTryCatch(){
try {
userMapper.insert(createUser());
throw new RuntimeException("saveUserWithTryCatch");
} catch (RuntimeException e) {
e.printStackTrace();
}
}
坑三解决办法
/**
* try-catch 后 事务不好使,手动回滚
*/
@Transactional()
public void saveUserWithTryCatchRight(){
try {
userMapper.insert(createUser());
throw new RuntimeException("saveUserWithTryCatch");
} catch (RuntimeException e) {
e.printStackTrace();
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
坑四:@Transactional()注解默认回滚是RuntimeException和Error
/**
* 默认是RuntimeException和Error
* @throws Exception
*/
@Transactional()
public void saveUserThrowException() throws Exception {
userMapper.insert(createUser());
throw new Exception("saveUserThrowException");
}
坑四解决办法
/**
* 默认是RuntimeException和Error,手动rollbackFor
* @throws Exception
*/
@Transactional(rollbackFor = Exception.class)
public void saveUserThrowExceptionRollbackFor() throws Exception {
userMapper.insert(createUser());
throw new Exception("saveUserThrowException");
}

本文介绍了在使用Spring事务时可能遇到的四个常见问题:1) 调用私有方法导致事务失效;2) 在同一实例中调用方法无法启动事务;3) try-catch块中事务处理不当;4) 默认只回滚运行时异常。针对这些问题,提供了相应的解决方案,包括使用self注入、手动设置回滚和指定回滚异常类型。了解这些陷阱有助于避免在实际开发中出现事务管理错误。
377

被折叠的 条评论
为什么被折叠?



