如何在Grails中的现有事务中创建新事务

use*_*627 5 grails transactions

我有Machine and Parts域类

在我的服务类中,我试图启动一个事务,在该事务内,我想创建一个新事务,并在内部事务中将其提交。

Machine.withTransaction { // transaction 1
    // some code to add Parts

    // some code to remove Parts
    Machine.withNewTrasaction { // transaction 2
       // some code to remove Parts.
    } // end of transaction 2

// some code to update couple of columns in machine table.
}// end of transaction 1
Run Code Online (Sandbox Code Playgroud)

当它出来时,transaction 2我想transaction 2提交与机器无关的零件transaction 1。但是grails抛出了一个错误,如"Illegal attempt to associate a collection with two open sessions" 如何transaction 2单独提交单独而不考虑transaction 1

dma*_*tro 1

您可以尝试使用@Transactional服务类内的注释显式处理事务。

笔记:-

  • 一旦您@Transactional向服务方法添加注释,默认情况下该服务类将不被视为事务性的。
  • 由于您将功能拆分为两个方法,因此您必须使用proxied服务类的实例来调用第二个方法,否则您无法为第二个方法创建新事务。applicationContext因此,在方法 1 中使用下面的方法。
  • 您将不再需要withTransactionwithNewTransaction阻止。

服务类看起来像:

class MachineService{
   @Transactional
   def someMethodToAddParts(){
       ......
       grailsApplication.mainContext.machineService.someMethodToRemoveParts()
       ......
   }

   @Transactional(propagation = TransactionDefinition.PROPAGATION_REQUIRES_NEW)
   def someMethodToRemoveParts(){
     .......
   }
}
Run Code Online (Sandbox Code Playgroud)