执行一行代码和另一行代码,我如何确定它们是在同一个休眠事务中执行还是在不同的休眠事务中执行?在调查硬错误时,拥有当前交易的唯一ID将是一个有用的功能。
我尝试将TransactionStatus
强制转换为具有方法DefaultTransactionStatus
的实现getTransaction()
,但导致三个HibernateTransactionObject具有不同的hashCode……无济于事。
在下面的示例中,我想使用status1 ne status2
和status2 eq status3
这样的表达式。但是equals()
总是返回false
和TransactionStatus
的HibernateTransactionObject
:
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,Hibernate 3.6
最佳答案
还有另一种方法,只发送带有您想要的名称的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] Creating new transaction with name [MY TRANSACTION NAME]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
希望对您有所帮助,这是一个很好的建议,建议您在实际需要时进行跟踪或调试,以进行测试。
关于hibernate - Grails:如何区分一项交易与另一项交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18215385/