我正在使用Spring TransactionSynchronizationManager来注册beforeCompletion回调,如下所示:

@Transactional
public void doTransaction() {
    //do DB stuff
    updateDB();

    //register a synchronization
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
        @Override
        public void beforeCompletion() {
            if(!isCallApiSuccessful()) {
                //rollback the transaction
            }
        }
    });
}


问题是如何从beforeCompletion回调回滚事务?抛出异常会起作用吗?

最佳答案

抛出异常会起作用吗?


不可以,因为beforeCompletion()用于清理资源,因此无法使用。
根据文档,这是引发异常的原因:


  抛出:
  
  java.lang.RuntimeException-出现错误时;将被记录但不会
  传播(注意:不要在这里抛出TransactionException子类!)


如果您想阻止提交,则可能应该实现void beforeCommit(boolean readOnly)并在其中添加RuntimeException
根据文档,这是引发异常的原因:


  抛出:
  
  java.lang.RuntimeException-出现错误时;将传播到
  调用方(注意:不要在这里抛出TransactionException子类!)

07-24 13:45