我有一個標記爲事務性的Grails服務,它做了很多工作。Grails交易問題
我將代碼添加到此方法並沒有得到,我希望當我通過它一步結果:
- 我有一個調用
.save()
不能在MySQL後臺看到,直到整個方法完成代碼。這是我期望的服務方法是事務性的。 - 我有其他代碼調用
.save()
,可以在服務方法完成之前在MySQL中看到。我不明白這一點,我不明白這和1之間的差距。 - 我還有更多的代碼使用
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
使其齊平,但我現在明白了,只是沖水休眠但實際上沒有提交事務,因爲它是事務性的。我究竟做錯了什麼?
目前還不清楚你發佈的代碼發生了什麼,而且在我看來你打破了慣例。在一個事務上下文中(grails方法調用),你故意試圖擺脫事務? 另外,你爲什麼強迫刷新? –
@HansWesterbeek我沒有試圖擺脫任何事務 - 我只是看着我繼承的代碼,並試圖理解它。我強迫刷新作爲測試(因爲我當時不明白),但我打算刪除它。除了當前在事務外運行的'createResults'方法之外,沒有任何東西應該提交,直到整個事務提交爲止,對吧? – skaz