我正在使用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子类!)