5

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

我正在向此方法添加代码,但在逐步执行时没有得到预期的结果:

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

请消除我的假设中的任何错误。以下是一些相关代码:

主要服务方式

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

创建一个

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

创建B

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

创建结果

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

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

4

2 回答 2

7

您可以通过使用带有连接参数的构造函数来groovy.sql.Sql在您的服务方法正在使用的事务中运行:Sql

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

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

于 2012-06-03T17:36:44.277 回答
0

我也有类似的情况。为我解决的问题是调用 refresh() 方法。我还尝试了 flush:true 和其他很多东西,但没有任何效果。

您可以在此处阅读有关刷新的信息。

于 2012-06-04T07:16:56.663 回答