【问题标题】:Get spring transaction by it's ID and check status通过 ID 获取 spring 交易并检查状态
【发布时间】:2015-09-20 15:21:59
【问题描述】:

有没有什么方法可以获取当前的事务 id,存储/传递它,并在应用程序的另一部分检查它的状态?

例如:

@Service
public class Service {
    ...
    @Transactional(rollbackFor = Exception.class)
    public void performAction(Action action) {
        // start action
        String transactionId = ???     // getting current transaction id
        messenger.send(transactionId); // sending transaction id to consumer
        // continue action
    } <- commit transaction
}

public class Consumer {
    ...
    public void onRecieveMessage(String transactionId) {
        TransactionStatus ts = ??? // getting transaction from pool by id
        if (ts.isCompleted()) {
            // some actions
        } else {
            // wating or Future<?> or something else...
        }
    }
}

(其实问题是Consumer.onRecieveMessage在action的事务完成之前执行,数据状态是旧的)

【问题讨论】:

    标签: java spring transactions spring-transactions transactional


    【解决方案1】:

    我不知道通过 ID 获取特定交易的任何方法(希望有人知道)。

    我要做的是实现一个 TransactionSynchronization 的实例,它包含您想要跟踪的一种值:

    public class YourTransactionTracker extends TransactionSynchronizationAdapter {
    
        private Value value;
    
        public YourTransactionTracker(Value value) {
            this.value = value;
        }
    
        @Override
        public void afterCompletion(int status) {
            //transaction handling your 'value' has been completed with the status 'status'
            //do whatever you want here
        }
    
        //you can also override other methods like beforeCompletion(), flush(), etc...
        //have a look at TransactionSynchronizationAdapter
    }
    

    TransactionSynchronizationAdapter 只是带​​有空方法的TransactionSynchronization 的实现。

    然后,您可以使用您的 TransactionSynchronization 实例在事务中挂钩回调,该回调将在事务生命周期的不同阶段调用。

    您可以在 Spring 中使用TransactionSynchronizationManager

        TransactionSynchronizationManager.registerSynchronization(
                 new YourTransactionTracker(theValueYouAreTracking);
    

    【讨论】:

    • 那这种情况下怎么获取transactionId呢?
    • @NikolayShabak 抱歉,我不知道该怎么做。我已经用替代解决方案编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-09-21
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多