Grails 调用lock()后如何解锁域对象?

Grails 调用lock()后如何解锁域对象?,grails,gorm,grails-2.0,Grails,Gorm,Grails 2.0,如果在域实例上或在类上静态调用lock(),然后您决定对该对象没有任何操作,是否有方法手动立即释放锁?要展开所述内容,请指示: 当事务提交时,锁会自动释放 因此,一旦调用.save(),当该save的事务提交时(通常在服务结束方法时),锁将被释放 您可能还想签出这些。提交事务时会释放锁,但在调用save()时不会释放锁,因为save()之后的事务仍处于活动状态。当代码执行离开服务方法或刷新hibernate会话时(http请求完成后,会话被刷新并清除),可以提交事务 释放锁的最佳方法是使用手动事

如果在域实例上或在类上静态调用
lock()
,然后您决定对该对象没有任何操作,是否有方法手动立即释放锁?

要展开所述内容,请指示:

当事务提交时,锁会自动释放

因此,一旦调用
.save()
,当该save的事务提交时(通常在服务结束方法时),锁将被释放


您可能还想签出这些。提交事务时会释放锁,但在调用save()时不会释放锁,因为save()之后的事务仍处于活动状态。当代码执行离开服务方法或刷新hibernate会话时(http请求完成后,会话被刷新并清除),可以提交事务

释放锁的最佳方法是使用手动事务处理。在服务中,请执行以下操作:

def saveUser(Long userId)
{
    User.withNewTransaction { TransactionStatus status ->
        User user = User.lock(userId)
        user.save()
    }
}

它被锁定以进行更新,因此您可以在域对象上调用
save()
,以释放锁,尽管这可能会很昂贵。我已经看到了您参考的文档。我希望他们只是漏掉了一些东西,例如,一种方法来反转一个不需要的锁。我想没有别的办法了,否则你或医生会提到的?嵌套事务呢?我可以开始一个嵌套事务,锁定一行,然后在不需要锁的情况下回滚嵌套事务吗?@greymatter Hm,不确定是否有嵌套事务,但我确实发现这个链接可能有用?这不是我所希望的,但我会记下答案。谢谢当然有个问题。。。e、 g.抛出异常,因此spring将自动回滚。。。但是你捕获它有X个原因。您可能需要手动释放锁。可能放弃会释放它?服务方法会自动放置在事务中(默认情况下)。是的,但它发生得太晚,另一个并发事务无法看到它,服务可以调用其他服务,并且可能需要几分钟左右才能提交事务。我明白了,我没有清楚地阅读您的答案。谢谢你的详细说明。