Grails - 保存多个对象,如果一个对象无法保存,则回滚所有对象

时间:2014-01-15 13:03:55

标签: grails transactions gorm

我需要一次保存多个对象,如果一个对象无法保存,则回滚所有对象。 例如:

class Transaction {
  Item item;
}

class Item {
  date lastTransaction;
}

如果我创建新的Transaction,我需要更改lastTransaction值并保存该项。
如果我未能保存该项目,我需要回滚事务(反之亦然)。

有什么想法吗?

2 个答案:

答案 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