1

执行一行代码和另一行,我怎么知道它们是在同一个休眠事务中执行还是在不同事务中执行?在调查硬错误时,拥有当前事务的唯一 ID 将是一个有用的功能。

我尝试转换为具有方法TransactionStatus的实现,但这导致三个 HibernateTransactionObject 具有不同的 hashCode... 没有帮助。DefaultTransactionStatusgetTransaction()

在下面的示例中,我想要使用 and 之类的status1 ne status2表达式status2 eq status3。但equals()总是false返回TransactionStatusHibernateTransactionObject

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 回答