如何将两个单元操作(removeAll + create)合并为一个

时间:2013-08-30 14:45:13

标签: database grails spring-security rollback

应用程序中每个用户同时只有一个角色。要更新角色,我们先前删除了所有当前角色:

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?

1 个答案:

答案 0 :(得分:2)

服务是正确的选择,因为它们已经是交易性的。这意味着如果出现问题,交易将被回滚。

附注是,只有未经检查的例外才会回滚您的交易。