【问题标题】:How to get the transaction Status from HibernateTransactionManager如何从 HibernateTransactionManager 获取事务状态
【发布时间】:2015-06-19 09:37:53
【问题描述】:

我正在尝试将我的 Spring 事务管理器从 JtaTransactionManager 升级到 HibernateTransactionManager。在 JTA TransactionManager 中,我们有一种方法可以给出当前事务的状态。根据状态我们正在做一些操作。实现如下:

private void checkTransactionStatus(TransactionStatus status){
             if(status instanceof DefaultTransactionStatus) {
                DefaultTransactionStatus transactionStatus = (DefaultTransactionStatus) status;
                if(transactionStatus.getTransaction() instanceof JtaTransactionObject){
                    JtaTransactionObject txObject = (JtaTransactionObject) transactionStatus.getTransaction();
                    int jtaStatus;
                    try {
                        jtaStatus = txObject.getUserTransaction().getStatus();
                        if(jtaStatus==Status.STATUS_MARKED_ROLLBACK){
                            // logic heare
                        }
                    } catch (SystemException e) {}
                }
             }
           }

我想用 HibernateTransactionManager 特定代码替换此方法。我分析发现,HibernateTransactionManager 使用 HibernateTransactionObject 作为事务对象。但是,不幸的是,它是一个私有内部类,我无法使用它来获取状态。然后我尝试使用父类JdbcTransactionObjectSupport。但是,我不知道如何从这个父类对象中获取状态。

private void checkTransactionStatus(TransactionStatus status){
         if(status instanceof DefaultTransactionStatus) {
            DefaultTransactionStatus transactionStatus = (DefaultTransactionStatus) status;
            if(transactionStatus.getTransaction() instanceof JdbcTransactionObjectSupport){
                JdbcTransactionObjectSupport txObject = (JdbcTransactionObjectSupport) transactionStatus.getTransaction();
                //how to get the current status ?
            }
         }
       }

【问题讨论】:

  • 似乎过于复杂,使用TransactionSynchronizationManager 来注册您的回调,节省您调用此方法的时间,因为无论使用何种技术,您都会收到回调。
  • 您是否只对 STATUS_MARKED_ROLLBACK 或其他值感兴趣?
  • @Marvin.. 到目前为止.. 我只需要 STATUS_MARKED_ROLLBACK 值。

标签: java spring hibernate transactions jta


【解决方案1】:

Spring 有一个接收回调的机制。您可以实现TransactionSynchronization 接口(或更容易扩展TransactionSynchronizationAdapter)。您可能想要实现afterCompletion(int) 方法并将您的逻辑放入其中。

public class MyTxCallback extends TransactionSynchronizationAdapter {

    public void afterCompletion(int status) {
        if (status==STATUS_ROLLED_BACK) {
            //logic here.
        }
    }

}

然后,您可以通过在事务启动时调用TransactionSynchronizationManager 将其绑定到事务。现在,当事务完成时,将调用该方法,您可以执行您的逻辑(无论使用的底层事务资源如何)。

【讨论】:

    【解决方案2】:

    如果您使用HibernateTransactionManager,您可以从 Hibernate Session 中获取当前事务状态:

    LocalStatus status = session.getTransaction().getLocalStatus();
    

    LocalStatus 具有以下状态:

    public enum LocalStatus {
        /**
         * The local transaction has not yet been begun
         */
        NOT_ACTIVE,
        /**
         * The local transaction has been begun, but not yet completed.
         */
        ACTIVE,
        /**
         * The local transaction has been competed successfully.
         */
        COMMITTED,
        /**
         * The local transaction has been rolled back.
         */
        ROLLED_BACK,
        /**
         * The local transaction attempted to commit, but failed.
         */
        FAILED_COMMIT
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      相关资源
      最近更新 更多