执行一行代码和另一行,我怎么能判断它们是在同一个hibernate事务中执行还是在不同的事务中执行?在调查难题时,拥有当前交易的唯一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
答案 0 :(得分: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
希望它有所帮助,这是一个很好的建议,你应该跟踪它,以防你真正需要它,调试或测试一些东西。
答案 1 :(得分:0)
我以黑客方式解决了它,依赖于“连接持有者”,即“目标连接的事务感知代理”。我很高兴找到一个更清洁的方式。对于最初的示例,此方法提供了正确的UID:status1 != status2 && status2 == status3
。虽然我不确定它是否稳定,但它可能对调试很有用。
// groovy code, not java
int getCurrentTransactionUid(TransactionStatus ts) {
DefaultTransactionStatus dts = ts
return dts.transaction.connectionHolder.hashCode()
}