【问题标题】:Using Grails Exector Plugin's runAsync , Why do I need a transaction to save a Domain object?使用 Grails Execector 插件的 runAsync ,为什么我需要事务来保存域对象?
【发布时间】:2013-10-06 14:50:59
【问题描述】:

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

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

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

所以我接下来尝试了这个,认为域对象“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()
      }
    }

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

【问题讨论】:

    标签: hibernate grails transactions grails-orm executor


    【解决方案1】:

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

    我不明白为什么需要此事务,因为我没有将我正在编写上述代码的服务设置为事务性

    看看NOTE ON TRANSACTIONS。您需要您的服务是事务性的。

    关于交易的注意事项:请记住,这是衍生出一个新的 线程并且任何调用都将在您所在的事务之外 在你的闭包中使用 .withTransaction,可运行或可调用 使您的进程在未调用的事务中运行 事务性 服务方法(例如在 控制器)。

    更新
    试试下面的服务类:

    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
        }
    }
    

    【讨论】:

    • 所以这是我不明白的部分:“任何呼叫都将在您所在的事务之外。”我不认为我在交易。还是说 Grails 中的所有服务都是自动事务?
    • 是的,Grails 中的所有服务默认都是事务性的,除非您指定 static transactional = false。看我的更新。 @TriArc
    • 感谢@dmahapatro 澄清服务的性质。但是,我看不出我在第二次尝试中所做的事情(如我上面的帖子所示)与您在更新中显示的内容之间有什么区别。为了简单起见,我展示的代码去掉了 anotherMethod() ,但这正是我在代码中所做的,我得到了同样的错误。为什么在这种情况下有另一种方法会有所帮助?谢谢!
    • @TriArc 您的服务是事务性的吗?您是否在其任何方法中使用@Transactional
    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2022-11-20
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多