Grails交易问题

时间:2012-06-03 15:46:46

标签: hibernate grails groovy transactions

我有一个标记为事务性的Grails服务,并且它做了很多事情。

我正在为此方法添加代码,而不是在我逐步完成时获得我期望的结果:

  1. 我有调用.save()的代码,在整个方法完成之前,在MySQL后端无法看到。鉴于服务方法是事务性的,这是我所期望的。
  2. 我有其他调用.save()的代码,可以在服务方法完成之前在MySQL中看到。我不明白这一点,我不明白这和1之间的差距。
  3. 我还有更多使用groovy.sql.Sql插入数据库的代码。我猜这是在Grails事务处理之外,所以在方法结束之前提交这一事实是有道理的。我可以让Grails在交易中管理这个吗?
  4. 请在我的假设中消除任何错误。以下是一些相关代码:

    主要服务方法

    public void updateDb(Date date) {
            // Create the results
            if (createResults() > 0) {
                createA()
                createB()
            }
    }
    

    createA

    A a = new a()
    a.user = user
    a.week = week
    a.save()
    

    createB

    userWeek = new UserWeek(user: user)
    userWeek.number = 1
    userWeek.save(flush: true)
    

    createResults

    String insert = "insert into ..."
    Sql sql = new Sql(dataSource)
    sql.execute(insert)
    

    我添加flush:true以使其刷新,但我现在明白,只是刷新hibernate但实际上没有提交事务,因为它是事务性的。我做错了什么?

2 个答案:

答案 0 :(得分:7)

您可以使用Sql constructor that takes a connection argument改为在您的服务方法正在使用的交易中运行groovy.sql.Sql

  Sql sql = new Sql(sessionFactory.currentSession.connection())

这应解决在同一服务方法中在不同时间提交数据的问题。

答案 1 :(得分:0)

我遇到了类似的情况。为我解决的是调用refresh()方法。我也尝试了冲洗:真实和其他东西,但没有任何工作。

您可以阅读有关刷新here的信息。