Hibernate Grails:如何区分一个事务和另一个事务?
执行一行代码和另一行代码时,如何判断它们是在同一个hibernate事务中执行还是在不同的hibernate事务中执行?在调查硬bug时,让当前事务的唯一ID可用将是一个有用的特性 我尝试将Hibernate Grails:如何区分一个事务和另一个事务?,hibernate,grails,transactions,gorm,Hibernate,Grails,Transactions,Gorm,执行一行代码和另一行代码时,如何判断它们是在同一个hibernate事务中执行还是在不同的hibernate事务中执行?在调查硬bug时,让当前事务的唯一ID可用将是一个有用的特性 我尝试将TransactionStatus强制转换为一个实现DefaultTransactionStatus,该实现具有方法getTransaction(),但这导致三个HibernateTransactionObject具有不同的hashCode。。。没有帮助 在下面的示例中,我希望有像status1ne stat
TransactionStatus
强制转换为一个实现DefaultTransactionStatus
,该实现具有方法getTransaction()
,但这导致三个HibernateTransactionObject具有不同的hashCode。。。没有帮助
在下面的示例中,我希望有像status1ne status2
和status2eq status3
这样的表达式。但是equals()
对于TransactionStatus
和HibernateTransactionObject
始终返回false
:
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我用黑客的方式解决了这个问题,依靠“连接持有者”,即“目标连接的事务感知代理”。我很高兴找到一个更干净的方法。对于初始示例,此方法提供正确的UID:
status1!=状态2&&status2==status3
。虽然我不确定它是否稳定,但它可能对调试有用
// groovy code, not java
int getCurrentTransactionUid(TransactionStatus ts) {
DefaultTransactionStatus dts = ts
return dts.transaction.connectionHolder.hashCode()
}
我用黑客的方式解决了这个问题,依靠“连接持有者”,即“目标连接的事务感知代理”。我很高兴找到一个更干净的方法。对于初始示例,此方法提供正确的UID:
status1!=状态2&&status2==status3
。虽然我不确定它是否稳定,但它可能对调试有用
// groovy code, not java
int getCurrentTransactionUid(TransactionStatus ts) {
DefaultTransactionStatus dts = ts
return dts.transaction.connectionHolder.hashCode()
}
还有另一种方法,只需发送带有所需名称的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.grailshbernateTransactionManager]创建名为[MY transaction name]的新事务:需要传播,默认隔离
希望能有所帮助,这是一个很好的建议,您应该跟踪它,以备实际需要,以便调试或测试某些东西。还有另一种方法,只需发送一个带有您想要的名称的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.grailshbernateTransactionManager]创建名为[MY transaction name]的新事务:需要传播,默认隔离
希望它能有所帮助,这是一个很好的建议,您应该跟踪它,以备实际需要,以进行调试或测试。请遵循每次创建新DefaultTransactionStatus的位置。withTransaction和withNewTransaction使用默认传播策略[propagation_REQUIRED],除非另有规定,否则每次都会导致处理创建新的事务状态,因此,除了必要时回滚事务外,事务状态没有太大的相关性。请遵循每次创建新DefaultTransactionStatus的位置。除非另有规定,否则withTransaction和withNewTransaction使用默认传播策略[propagation_REQUIRED],这会导致每次处理时都创建一个新的事务状态,因此事务状态除了必要时回滚事务之外没有太大的相关性。