我有一个标记为事务性的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
以使其刷新,但我现在明白,只是刷新hibernate但实际上没有提交事务,因为它是事务性的。我做错了什么?
答案 0 :(得分:7)
您可以使用Sql
constructor that takes a connection argument改为在您的服务方法正在使用的交易中运行groovy.sql.Sql
:
Sql sql = new Sql(sessionFactory.currentSession.connection())
这应解决在同一服务方法中在不同时间提交数据的问题。
答案 1 :(得分:0)
我遇到了类似的情况。为我解决的是调用refresh()方法。我也尝试了冲洗:真实和其他东西,但没有任何工作。
您可以阅读有关刷新here的信息。