在@Transactional中捕获异常记录日志?异常时事务回滚与提交疑问
问题解答
1. 能不能在@Transactional方法里捕获异常记录错误?
完全可以,但这么做会影响事务的提交和回滚逻辑,得留意后续的行为。
2. repository.save(entity)会被回滚吗?
分两种场景看:
- 如果
repository.save(entity)执行时直接抛出异常,说明这次保存本身就没成功(比如违反数据库约束、连不上库之类的),根本没有已提交的数据需要回滚。 - 要是
repository.save(entity)成功了,但try块里后续操作抛了异常(你的代码里没这种情况),因为你把异常捕获了没往外抛,Spring不会触发事务回滚,之前的保存操作会被正常提交,不会回滚。
3. errorRepository.save会被提交吗?
会提交。Spring默认只有当未捕获的RuntimeException或者Error跑出事务方法外面时,才会触发回滚。你现在在方法内部把异常接住了,事务管理器会认为事务正常完成,所以errorRepository.save的记录会被持久化到数据库。
额外提醒
要是你想在捕获异常时,同时回滚之前已经成功的操作(比如save成功后后续步骤出错),得手动把事务标记为回滚状态,在catch块里加一行:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
但这么做的话,errorRepository.save的操作也会跟着回滚,因为整个事务被标记成了回滚。如果想让错误记录不受原事务影响,得把错误记录的操作放到独立事务里,比如给处理错误保存的方法加@Transactional(propagation = Propagation.REQUIRES_NEW),强制开新事务。
内容的提问来源于stack exchange,提问作者J.J. Beam
相关产品推荐
相关产品推荐

