我必须同时更新需要更新的域类,我想使用一个事务来允许更改两者或两者都不。例如:
我有两个不同的域类(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,但我有两个不同的域,所以我应该嵌套吗?
答案 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类。您可以根据需要混合搭配。
再一次,强调。 正确的方法是使用服务。