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

Database 如何将两个单元操作(removeAll和create)合并为一个,database,grails,spring-security,rollback,Database,Grails,Spring Security,Rollback,应用程序中每个用户同时只有一个角色。要更新角色,我们以前会删除所有当前角色: Integer roleId = params.roleSelector.toInteger() def roleInstance = Role.findById(roleId) UserRol.removeAll userInstance UserRol.create userInstance, roleInstance 它正在工作,但我认为更正确的做法是将removeAll和create作为一个统一的操作来执行,

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

Integer roleId = params.roleSelector.toInteger()
def roleInstance = Role.findById(roleId)
UserRol.removeAll userInstance
UserRol.create userInstance, roleInstance
它正在工作,但我认为更正确的做法是将removeAll和create作为一个统一的操作来执行,以便在发生任何错误时进行正确的回滚

可能吗

更新1

我发现我们可以添加@Transactional来使方法具有事务性。因此,如果我们写:

@Transactional
private def unitaryOperationUpdate {

    Integer roleId = params.roleSelector.toInteger()
    def roleInstance = Role.findById(roleId)
    UserRol.removeAll userInstance
    UserRol.create userInstance, roleInstance
}
如果removeAll和create之间发生错误,它是否会正确回滚


顺便说一句,我想知道如何检查它是否工作:我在一个单独的线程中问了这个问题:

服务是这样做的合适地方,因为它们已经是事务性的了。这意味着,如果出现问题,事务将回滚


需要注意的是,只有未经检查的异常才会回滚您的事务。

在我看来,将代码移动到服务将不可避免地使代码复杂化。在研究控制器中的事务性时,我发现可以添加@transactional使方法具有事务性。我更新了我的问题(更新1)