1

コード行と別の行を実行すると、それらが同じ hibernate トランザクション内で実行されているか、別のトランザクション内で実行されているかをどのように判断できますか? 現在のトランザクションの一意の ID を利用できるようにすると、ハード バグを調査する際に便利な機能になります。

メソッドを持つTransactionStatus実装にキャストしようとしましたが、その結果、異なる hashCode を持つ 3 つの HibernateTransactionObject が作成されました... 役に立ちません。DefaultTransactionStatusgetTransaction()

status1 ne status2以下の例では、 andのような式が必要status2 eq status3でした。ただし、との両方に対してequals()常に返されます。falseTransactionStatusHibernateTransactionObject

Dog.withTransaction { TransactionStatus status1 ->
    Dog.withNewTransaction { TransactionStatus status2 ->
        Dog.withTransaction { TransactionStatus status3 ->
            print(status1)
            print(status2)
            print(status3)
        }
    }
}

出力:

org.springframework.transaction.support.DefaultTransactionStatus@d42932c / org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@3f02d1d0
org.springframework.transaction.support.DefaultTransactionStatus@598b083a / org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@dcc3481
org.springframework.transaction.support.DefaultTransactionStatus@5803214e / org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@36c945c3

Grails 2.2.0、休止状態 3.6

4

2 に答える 2

1

別の方法があります。必要な名前で TransactionDefinition を送信するだけです。

public void updateStatusSomething(somethingToUpdate, anotherThingToUpdate) {
    def transactionDefinition = new DefaultTransactionDefinition()
    transactionDefinition.setName("MY TRANSACTION NAME")
    Domain.withTransaction(transactionDefinition) {
        updateSomething(somethingToUpdate)
        updateAnotherThing(anotherThingToUpdate)
    }
}

これを log4j Config.groovy に追加すると、

trace 'org.codehaus.groovy.grails.orm.hibernate.GrailsHibernateTransactionManager'

ログには、次のようなものが表示されます。

2015/07/08 11:55:05 [hibernate.GrailsHibernateTransactionManager] [MY TRANSACTION NAME] という名前の新しいトランザクションを作成しています: PROPAGATION_REQUIRED,ISOLATION_DEFAULT

何かをデバッグまたはテストするために実際に必要な場合に備えて、これをトレースすることをお勧めします。

于 2015-07-08T15:11:13.110 に答える
0

「ターゲット接続のトランザクション対応プロキシ」である「接続ホルダー」に依存して、ハックっぽい方法で解決しました。確かにきれいな方法を見つけてうれしいです。最初の例では、このメソッドは正しい UID を提供します: status1 != status2 && status2 == status3. 安定しているかどうかはわかりませんが、デバッグに役立つ可能性があります。

// groovy code, not java
int getCurrentTransactionUid(TransactionStatus ts) {
  DefaultTransactionStatus dts = ts
  return dts.transaction.connectionHolder.hashCode()
}
于 2013-08-17T11:04:25.927 に答える