【发布时间】:2011-04-04 13:28:25
【问题描述】:
我在 Grails 中遇到事务问题。我想通过每个对象的检查条件将对象列表保存到 DB。我想将所有这些过程放到一个事务中,这意味着如果第 k 个对象不满足检查条件,则所有先前的对象(从第一个对象到第 (k-1) 个对象)将从 DB 回滚.这是我的例子:
static transactional = true
public void saveManyPeople() {
// ...
List<People> peoples = new ArraysList();
for(i = 0, i < n, i++) {
People newPeople = createPeopleFromRawData(); // return a people object in memory
if(<checking-condition>) {
newPeople.save(flush : false)
} else {
throw new MyCustomizedException() // MyCustomizedException has extended from RuntimException
}
}
// ...
}
如您所见,我将事务变量设置为 true,并尝试使用 flush:true 和 flush:false,但它没有按我的意愿工作。我读过这篇文章Rolling back a transaction in a Grails Service 并且作者建议服务方法应该抛出一个 RuntimeException 然后进程将被回滚。但是如果我想抛出另一个异常,那我该怎么办? 你能给我一些关于这个问题的建议吗? 非常感谢!
【问题讨论】:
-
那它是如何工作的呢?你从哪里调用它,它是从另一个服务调用的吗?
-
嗨 Victor,函数 saveManyPeople() 在我的服务类中,这个函数将从控制器调用,而不是从另一个服务类调用。谢谢!
标签: grails transactions rollback