Hibernate Grails:如何区分一个事务和另一个事务?

Hibernate Grails:如何区分一个事务和另一个事务?,hibernate,grails,transactions,gorm,Hibernate,Grails,Transactions,Gorm,执行一行代码和另一行代码时,如何判断它们是在同一个hibernate事务中执行还是在不同的hibernate事务中执行?在调查硬bug时,让当前事务的唯一ID可用将是一个有用的特性 我尝试将TransactionStatus强制转换为一个实现DefaultTransactionStatus,该实现具有方法getTransaction(),但这导致三个HibernateTransactionObject具有不同的hashCode。。。没有帮助 在下面的示例中,我希望有像status1ne stat

执行一行代码和另一行代码时,如何判断它们是在同一个hibernate事务中执行还是在不同的hibernate事务中执行?在调查硬bug时,让当前事务的唯一ID可用将是一个有用的特性

我尝试将
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],这会导致每次处理时都创建一个新的事务状态,因此事务状态除了必要时回滚事务之外没有太大的相关性。