0

这大致是我在服务中所做的:

runAsync 
{
  <some work here>
  myDomainObject.merge()     
}

我收到一条错误消息,提示“没有绑定到线程的休眠会话,并且配置不允许在此处创建非事务性会话”。我确定代码是异步运行的,因此执行器插件似乎设置正确。

所以我接下来尝试了这个,认为域对象“myDomainObject”不能绑定在这个线程中,尽管线程有一个休眠会话,这要归功于执行器插件:

runAsync
{
  <work>
  def instance2= MyDomainObject.get(myDomainObject.id) // works
  instance2.field1=123
  instance2.save() // fails
}

我在这里遇到了同样的错误,有趣的是,get() 成功地带来了正确的数据并将其设置为 instance2。只有“save()”失败。我知道这一点是因为我已经在调试器中逐步完成了代码。

最后,如果我执行以下操作,一切正常:

runAsync 
    {
      <some work here>
      MyDomainObject.withTransaction {
           myDomainObject.field1=123
           myDomainObject.merge()
      }
    }

我不明白为什么需要此事务,因为我尚未将编写上述代码的服务设置为事务性的。我知道这里肯定有一些我不知道的基本知识,但我不知道它是什么。

4

1 回答 1

2

看起来你回答了你自己的问题:)

我不明白为什么需要此事务,因为我尚未将编写上述代码的服务设置为 transactional

看一下关于交易的注意事项。你需要你的服务是事务性的。

事务注意事项:请记住,这是一个新线程,并且任何调用都将在您所在的事务之外。在您的闭包、可运行或可调用的内部使用 .withTransaction 以使您的进程在非事务中运行调用 事务服务方法(例如在控制器中使用 this 时)。

更新
尝试如下服务类:

class MyService{

    def someMethod(){
        runAsync {
            anotherMethod()
        }
    }

    def anotherMethod(){ 
       <work>
       def instance2= MyDomainObject.get(myDomainObject.id) // works
       instance2.field1=123
       instance2.save() // should work as well
    }
}
于 2013-10-06T15:26:00.850 回答