悲观锁定grails 3+ lock()

时间:2017-08-24 11:12:11

标签: hibernate grails locking gorm pessimistic-locking

    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()之后其他实例无法更新?还是别的什么?或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

您是否使用相同的会话呼叫checkcheck2lock()方法选择要更新的行(在数据库级别),但如果你进入同一个会话并尝试获取相同的对象,你应该从hibernate会话中获取它而不是去数据库并且必须等待释放的行。

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