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

4

1 回答 1

1

你打电话checkcheck2同一个会话?该lock()方法选择要更新的行(在数据库级别),但是如果您进入同一个会话并尝试获取相同的对象,您应该从休眠会话中获取它,而不是进入数据库并不得不等待在要释放的行上。

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

于 2017-08-24T16:22:43.893 回答