在一次保存两个不同的域对象时使用Grails事务

时间:2014-04-20 02:02:22

标签: grails spring-transactions

我必须同时更新需要更新的域类,我想使用一个事务来允许更改两者或两者都不。例如:

我有两个不同的域类(User和Follow)

User currentUser =..
User targetUser = ..
Follow followUser = ..

targetUser.follower = targetUser.follower + 1
currentUser.follow = currentUser.follow + 1
targetUser.save(flush:true)
currentUser.save(flush:true)
followUser.save(flush:true) 

我希望所有这一切发生在一起,或者如果一个发生故障,它都不会发生并被回滚。我怎么能用grails做到这一点?我看到了DomainObject.withTransaction,但我有两个不同的域,所以我应该嵌套吗?

1 个答案:

答案 0 :(得分:3)

正确的解决方案是将此事务代码移动到服务中。 documentation概述了如何从控制器创建和使用服务。这是正确的解决方案。

但是,这不是唯一的方法。如您所见,可以使用withTransaction在事务范围内运行代码。例如(直接来自documentation):

Account.withTransaction { status ->
    def source = Account.get(params.from)
    def dest = Account.get(params.to)

    int amount = params.amount.toInteger()
    if (source.active) {
        source.balance -= amount

        if (dest.active) {
            dest.amount += amount
        }
        else {
            status.setRollbackOnly()
        }
    }
}

withTransaction闭包中的代码可以跨越任意数量的Domain类。您可以根据需要混合搭配。

再一次,强调。 正确的方法是使用服务