java - 从 beforeCompletion TransactionSynchronization 回滚事务?

标签 java spring transactions spring-transactions

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

最佳答案

Would throwing an exception work?

不,它不会工作,因为 beforeCompletion() 用于清理资源。
根据文档,以下是抛出异常的效果:

Throws:

java.lang.RuntimeException - in case of errors; will be logged but not propagated (note: do not throw TransactionException subclasses here!)

您可能应该实现 void beforeCommit(boolean readOnly) 来实现这一点,如果您想阻止提交,则在其中抛出 RuntimeException
根据文档,以下是抛出异常的效果:

Throws:

java.lang.RuntimeException - in case of errors; will be propagated to the caller (note: do not throw TransactionException subclasses here!)

关于java - 从 beforeCompletion TransactionSynchronization 回滚事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57963913/

相关文章:

java - 在java spring中声明错误代码列表的更简洁的方法是什么

java - 在 Activity JRE 中找不到 "tools.jar'

c++ - C++ 程序中的 SQL 查询语法错误,但在 MySQL Workbench 中有效

java - 如何计算等边三角形的坐标?

java - Android widget listview 处理点击

java - 构建项目 spring org.springframework.beans.factory.UnsatisfiedDependencyException 时出错

PHP PDO - 没有事件事务

php - 如何判断MySQL事务成功

java.sql.SQLException : null, 来自服务器的消息: "Host ' xxx' 不允许连接到此 MySQL 服务器”

JavaFX:同时处理组合键和鼠标事件