2012-06-03 46 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