我需要一次保存多个对象,如果一个对象无法保存,则回滚所有对象。 例如:
class Transaction {
Item item;
}
class Item {
date lastTransaction;
}
如果我创建新的Transaction,我需要更改lastTransaction值并保存该项。
如果我未能保存该项目,我需要回滚事务(反之亦然)。
有什么想法吗?
答案 0 :(得分:5)
呸。不要抛出异常以回滚事务。使用 副作用 会产生相当高的成本,其中事务管理器(假设运行时异常意味着您无法控制)会自动滚动支持您的交易,以防止您造成更多伤害。这有点像孤独,用锤子反复撞击自己的脑袋,所以一些EMT,也许护士或医生会花一些时间陪你。
回滚交易非常容易,但遗憾的是Grails没有公开任何此类事件:
import org.springframework.transaction.interceptor.TransactionAspectSupport
class FooService {
def someMethod(...) {
boolean somethingBadHappened = ...
if (somethingBadHappened) {
// roll back
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
}
// ok, proceed
...
}
}
稍后您可以使用
检查当前事务是否已回滚TransactionAspectSupport.currentTransactionStatus().isRollbackOnly()
请注意,这在控制器中不起作用,因为事务将在那时结束。
答案 1 :(得分:1)
创建一个服务方法并将持久性逻辑放在那里。当您致电save
时,如果您指定failOnError: true
,那么如果存在验证问题,则会引发异常并且您的交易将被回滚。
def myServiceMethod(...some parameters...) {
....
Item item = new Item(lastTransaction: new Date())
item.save(failOnError: true)
Transaction transaction = new Transaction(item: item)
transaction.save(failOnError: true)
...
return transaction
}
另外,请仔细阅读Grails文档的services section。