应用程序中每个用户同时只有一个角色。要更新角色,我们先前删除了所有当前角色:
Integer roleId = params.roleSelector.toInteger()
def roleInstance = Role.findById(roleId)
UserRol.removeAll userInstance
UserRol.create userInstance, roleInstance
它正在工作,但我认为执行removeAll并创建一个单一操作更正确,以便在发生任何错误时正确回滚。
有可能吗?
更新1 。
我发现here我们可以添加@Transactional来创建一个事务性方法。所以如果我们写:
@Transactional
private def unitaryOperationUpdate {
Integer roleId = params.roleSelector.toInteger()
def roleInstance = Role.findById(roleId)
UserRol.removeAll userInstance
UserRol.create userInstance, roleInstance
}
如果在removeAll和create之间发生了一些错误,它会正确回滚吗?
顺便说一句,我想知道如何检查自己是否有效:我在一个单独的帖子中提出了这个问题:How to check if a @transactional method perform rollback correctly in Grails?
答案 0 :(得分:2)
服务是正确的选择,因为它们已经是交易性的。这意味着如果出现问题,交易将被回滚。
附注是,只有未经检查的例外才会回滚您的交易。