我必须要同时更新需要更新的域类,我想使用事务以便允许对两者或两者都不进行更改。 例如 :

我有两个不同的域类(用户和关注)

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) 

我希望所有这些都一起发生,或者如果一个失败,则所有事情都不会发生并被回滚。 我怎样才能做到这一点? 我看到了DomainObject.withTransaction,但是我有两个不同的域,所以我应该嵌套吗?

===============>>#1 票数:3

正确的解决方案是将该事务代码移至服务中。 文档概述了如何从控制器创建和使用服务。 那是正确的解决方案。

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

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类。 您可以根据自己的喜好混合搭配。

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

  ask by AlexCon translate from so

未解决问题?本站智能推荐: