首页 > 解决方案 > 从 beforeCompletion TransactionSynchronization 回滚事务?

问题描述

我正在使用 SpringTransactionSynchronizationManager注册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回调中回滚事务?抛出异常会起作用吗?

标签: javaspringtransactionsspring-transactions

解决方案


抛出异常会起作用吗?

不,它不起作用,因为它beforeCompletion()是为了清理资源。
根据文档,这是引发异常的效果:

抛出:

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

如果您想阻止提交,您可能应该实施void beforeCommit(boolean readOnly)以实现这一目标并在其中抛出一个。 根据文档,这是引发异常的效果: RuntimeException

抛出:

java.lang.RuntimeException- 如果出现错误;将被传播给调用者(注意:不要在这里抛出 TransactionException 子类!)


推荐阅读