【问题标题】:Grails Transaction IssuesGrails 事务问题
【发布时间】:2012-06-03 15:46:45
【问题描述】:

我有一个标记为事务性的 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 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 以使其刷新,但我现在明白了只是刷新休眠而不实际提交事务,因为它是事务性的。我做错了什么?

【问题讨论】:

  • 目前尚不清楚您发布的代码中发生了什么,在我看来,您也违反了约定。从一个事务上下文(grails 方法调用)中,您是故意试图打破事务吗?另外,你为什么要强制同花?
  • @HansWesterbeek 我并没有试图打破任何交易 - 我只是在查看我继承的代码并试图理解它。我强制冲洗作为测试(因为我当时不明白)但我打算删除它。在完整的事务提交之前,什么都不应该提交(除了当前在事务之外工作的createResults 方法),对吧?

标签: hibernate grails groovy transactions


【解决方案1】:

您可以使用Sql constructor that takes a connection argument 代替groovy.sql.Sql 在您的服务方法正在使用的事务中运行:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多