在保存时禁用乐观锁定

时间:2014-06-05 09:17:48

标签: grails gorm

在Grails中,有没有办法忽略1次保存的乐观锁定并在另一次保存中使用它?我有一个集成服务,可以暂时将一些元数据更新到域实例,并且我不希望它锁定表单。我可以吗在运行时更改对象的版本属性或忽略在保存过程中提高版本号?或者有没有办法在保存过程中忽略OptimisticLockingFailureException?我想在这部分代码中禁用乐观锁定检查!

我试过跟随没有运气 - 它总是抛出"实例在你编辑时由另一个用户更新":

            // Validate before optimistic locking hacking - Save is done with validate: false
            if (filledForm && filledForm.validate() == true) {

                // Do not update version number (optimistic locking) on save
                if(filledForm.version > 0){

                    filledForm.version = filledForm.version - 1
                }

                filledForm.save(validate:false, deepValidate: false, flush:true, failOnError:false)

            }

我使用Grails 2.3.8和MongoDB-plugin 3.0.0

4 个答案:

答案 0 :(得分:1)

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

http://api.mongodb.org/java/current/com/mongodb/DBCollection.html

FormDomain.collection.findAndModify()

答案 1 :(得分:0)

作为一个肮脏的黑客你可以运行一个HQL查询来减少你的版本后“propper”save()

答案 2 :(得分:0)

默认情况下,GORM配置为启用乐观锁定。您可以通过使用参数false:

调用version方法来禁用它

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

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

答案 3 :(得分:-1)

如果它很简单,我会说注入你的dataSource并使用Groovy SQL直接更新属性:

def dataSource
...

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

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