grails - 成功调用服务后,Grails无法提交

标签 grails gorm transactional

我正在 2.4.4中的单个Service上执行以下逻辑。

class SampleService {
    void process(params1, params2) {
        SampleDomain1 sd1 = new SampleDomain1()
        sd1.setProperties(params1)
        sd1.save()

        SampleDomain2 sd2 = new SampleDomain2()
        sd2.setProperties(params2)
        sd2.save()
    }
}

我了解的是Service在默认情况下是事务性的。如果sd1.save()成功,但sd2.save()不成功,它将回滚更改并抛出错误。如果两者均成功,则两者均在服务退出时提交。

如果我的理解是正确的,那么这两个都应该已经保存到数据库中了。但是,问题是:不会—​​除非您基于我的测试(使用相同的flush: trueparams1组来显式使用params2参数),否则就不会。

        sd1.save(flush: true)

        SampleDomain2 sd2 = new SampleDomain2()
        sd2.setProperties(params2)
        sd2.save(flush: true)
    }

顺便说一下,这是我真正要避免的事情(将它设置为@Transactional的意义是什么)。如果这是Hibernate 4 / Grails 2.4的难点,那么我需要怎么做才能使我的服务在服务调用的每一端再次提交?我需要配置Grails的任何全局配置吗?我真的需要在每项服务结束时自动刷新Domain类。

注意

我已经保证数据是正确的,包括调用.validate()和其他检查器。成功执行.save(flush: true)证明了这一点。我发现的问题是FlushMode上的regarding to the update on Grails 2.4。现在,也许我真正需要的是全局设置来覆盖此设置。

最佳答案

如果您的数据没有刷新到数据库层,那么就会想到一些可能性。

  • 尝试保存到数据库时会出现某种错误,您可以尝试将failOnError = true参数传递给.save()调用以清楚地看到它。 (实际上,全局设置此项是一个好主意,因为默默地使数据库调用失败是一种偏头痛)
  • 您正在同一服务对象内调用此服务方法。由于使用了代理,这将使基础的 Spring 声明式事务无法正常工作。
  • 您可能已经在同一服务中添加了其他方法的注释,在这种情况下,默认的事务支持将不再适用于其余未注释的方法(这甚至是一个单词吗?)。
  • 您可能已经在服务文件夹之外的某个位置创建了服务,因为我从未尝试过,所以不太确定这是否会导致问题。
  • 您没有将山羊献给Groovy和Grails众神,而他们却把您的头弄得一团糟。

  • 编辑:
    我将尝试回答新编辑中的要点。
  • 您是否尝试了failOnError?当两个对象都一次刷新到数据库,而不是一次手动提交时,可能会出现此问题。
  • 通过找出一种在保存时自动刷新的方法,您将完全绕过AFAIK事务,现在,如果我错了,一定要这样做。但是在进行假设之前先进行测试。
  • 关于grails - 成功调用服务后,Grails无法提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34807123/

    相关文章:

    java - Spring Boot中如何使用@Transactional注解

    grails - 在Grails中创建多个域对象

    grails - grails 2.5在 “UTF-8”页面中未显示 “show”字符,但在 “edit”中显示了正确的字符。 Grails使用了错误的字符集

    grails - 修改字段以存储到数据库

    grails - 如何计算gorm中一对多关系中出现的次数-Grails

    java - 许多数据库操作的Spring Integration @Transactional回滚

    templates - Grails g:include标签包含 Controller 调用

    Grails Spring Security插件@Secured注解未解析

    hibernate - Grails save(flush:true)不会立即持久保存到数据库

    c# - 使用 TxNTFS 出现奇怪的间歇性错误