2012-06-03 44 views
5

我有一个标记为事务性的Grails服务,它做了很多工作。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() 
     } 
} 

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使其齐平,但我现在明白了,只是冲水休眠但实际上没有提交事务,因为它是事务性的。我究竟做错了什么?

+0

目前还不清楚你发布的代码发生了什么,而且在我看来你打破了惯例。在一个事务上下文中(grails方法调用),你故意试图摆脱事务? 另外,你为什么强迫刷新? –

+0

@HansWesterbeek我没有试图摆脱任何事务 - 我只是看着我继承的代码,并试图理解它。我强迫刷新作为测试(因为我当时不明白),但我打算删除它。除了当前在事务外运行的'createResults'方法之外,没有任何东西应该提交,直到整个事务提交为止,对吧? – skaz

回答

7

你可以groovy.sql.Sql在您的服务方法是通过使用Sql constructor that takes a connection argument而不是使用事务中运行:

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

这应该解决数据的问题,在同样的服务方法不同的时间越来越承诺。

+0

谢谢 - 这一定会解决我的问题的一部分! – skaz

0

我处于类似的情况。我为什么解决它是调用refresh()方法。我也尝试了flush:true和其他东西的加载,但没有任何工作。

你可以阅读关于刷新here