Grails 在保存时禁用乐观锁定

Grails 在保存时禁用乐观锁定,grails,gorm,Grails,Gorm,在Grails中,有没有一种方法可以忽略1 save的乐观锁定并在另一个save中使用它?我有一个集成服务,它每隔一段时间将一些元数据更新到域实例,我不希望它锁定表单。例如,是否可以在保存过程中动态更改对象的版本属性或忽略提高版本号?或者在保存过程中是否有方法忽略OptimisticLockingFailureException?我想禁用乐观锁定检查,在这1部分的代码只 我尝试了以下操作,但没有成功-它总是抛出“在您编辑时,另一个用户更新了该实例”: 我将Grails 2.3.8与结合使用,这是

在Grails中,有没有一种方法可以忽略1 save的乐观锁定并在另一个save中使用它?我有一个集成服务,它每隔一段时间将一些元数据更新到域实例,我不希望它锁定表单。例如,是否可以在保存过程中动态更改对象的版本属性或忽略提高版本号?或者在保存过程中是否有方法忽略OptimisticLockingFailureException?我想禁用乐观锁定检查,在这1部分的代码只

我尝试了以下操作,但没有成功-它总是抛出“在您编辑时,另一个用户更新了该实例”:


我将Grails 2.3.8与

结合使用,这是一种肮脏的攻击。您可以在“propper”save()之后运行HQL查询以减少您的版本。

如果它很简单,我会说只需插入您的数据源并使用Groovy SQL直接更新属性:

def dataSource
...

def sql = new Sql(dataSource)
sql.executeUpdate('update something set foo = ? where id = ?', ['bar', 1234L])

Hibernate有更多的域级选项,仅用于版本检查脏属性(optimistic lock=“dirty”),但我不确定Grails是否支持它们。

默认情况下,GORM配置为启用了乐观锁定。您可以通过调用参数为false的version方法来禁用此功能:

在域类中,设置如下映射:

static mapping = {
    // Used to disable optimistic locking
    version false
}

使用MongoDB低级API更新文档以忽略GORM级别检查


SQL/HQL在使用关系数据库时可能会工作,但在本例中,我使用的是MongoDB。我试图保存的MongoDB文档包含多个级别的嵌入文档。使用纯Gmongo可能是答案,但我无法成功地将GORM实例转换为映射。然而,我也对如何使用MySQL数据库感兴趣,但最好的解决方案会影响到它们。是否有任何闭包、配置或保存属性可用于实现正确的解决方案?好的。。。在我看来,这并不是一个正确的答案,但作为一种解决办法,我现在正按照你的建议去做。我使用的是Gmongo低级api,它允许修改version属性
filledForm.collection.update([''u id':新ObjectId(filledForm.id.toString())],[$inc:[version:-1]],false)
我正在寻找阻止乐观锁定操作或版本号更改的东西。看到我的其他评论了吗?为什么会被否决?它回答了这个问题。OP说他想忽略乐观锁定,我给了他一个选择。如果要确保此更改导致其他事务使用opt lock失败,只需将
version=version+1
添加到update语句中即可。使用的数据库为MongoDB时,使用SQL没有帮助。所使用的数据库在原始问题中被告知。这很公平,但该部分是在我的回答之后添加的,这可能会起作用,但我希望在默认情况下使用乐观锁定。我只想在1种情况下禁用Grail的自动乐观锁定功能(集成服务中的save调用)。我仍然没有找到在使用GORM时忽略提高版本号的方法,因此似乎我真的需要使用低级API。谢谢你的建议。
static mapping = {
    // Used to disable optimistic locking
    version false
}
FormDomain.collection.findAndModify()