Grails 3+ lock() 中的悲观锁定

Pessimistic locking in grails 3+ lock()

    def check(){
        println"start first"
        Domain1 domain1=Domain1.get(1);
        domain1.lock();
        println "locking started"
        sleep(20*60)
        println "save first"
        domain1.name="hari ram"
        domain1.save();
        println "save first completed"

    }
    def check2(){
        try {
            println"start second"
            Domain1 domain1=Domain1.get(1);
            println"save second"
            domain1.name="hari ram -------------------++++++++"
            domain1.save(flush:true,failOnError:true);
            println "save second completed"
        }
        catch(Exception ex){
            ex.each{
                println "error ${ex}"
            }
        }
    }

我上面代码的日志是:

start first
locking started
start second
save second
save second completed
save first
save first completed

数据库也会更新。为什么 lock() 不起作用?是不是在 lock() 之后其他实例无法更新?或者是别的东西?还是我遗漏了什么?

您是在同一会话中呼叫 checkcheck2 吗? lock() 方法选择要更新的行(在数据库级别),但是如果您进入同一个会话并尝试获取同一个对象,您应该从休眠会话中获取它而不是去数据库并且必须等待行被释放。

我不确定这是你的问题,但看起来你的代码是正确的(尽管在这个例子中你最好使用 Domain.lock(1) 同时获取和锁定它,有分别进行这两个调用没有错)。