【发布时间】:2021-12-10 20:53:13
【问题描述】:
我的项目中有一个服务方法,可以这样简化:
@Transactional
public void myTransactionalMethod(){
try {
soSomethingAndSaveOnDB(); // private method
}catch (Exception exception){
saveSomethingOnDBWhenAnErrorOccurs(); // private method
throw exception;
}
}
该方法是事务性的,并且正在执行一些可能导致抛出异常的主要逻辑。如果出现这种情况,则必须将保存在数据库中的所有数据恢复到以前的状态。
但我还需要在catch 块中处理抛出的异常,并在数据库中写入一些额外的数据来跟踪错误。
我的实现的问题是最终的throw exception 指令导致事务回滚并阻止创建与错误跟踪相关的数据。
我想在这种情况下“禁用”事务回滚,以便在我的数据库中正确记录错误。
注意我正在重新抛出异常以将其传播到控制器并将其转换为 HTTP 错误。
保留soSomethingAndSaveOnDB() 和saveSomethingOnDBWhenAnErrorOccurs() 方法private,这可能是一个很好的解决方案?
【问题讨论】:
-
是否需要从
catch块中抛出异常尚不清楚。无论如何,此时您已经完成了对数据库的登录。 -
你在
saveSomethingOnDBWhenErrorOccurs上尝试过Propagation.REQUIRES_NEW吗? -
然而,如果你必须抛出,那么抛出一个不同的异常,比如
AnotherException,它可以使用@Transactional( dontRolbackOn = AnotherException.class )被“排除”。 -
@SreeKumar 登录到数据库已经完成是对的,但我还需要将异常传播到控制器并将其转换为 HTTP 错误。所以;是的,我需要重新抛出异常。谢谢
-
@Marc 正如我在问题中指定的那样, saveSomethingOnDBWhenErrorOccurs 是一个私有方法,声明式事务处理不应该在私有方法上工作。
标签: java spring spring-boot spring-transactions