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() 之后其他实例无法更新?或者是别的东西?还是我遗漏了什么?
您是在同一会话中呼叫 check
和 check2
吗? lock()
方法选择要更新的行(在数据库级别),但是如果您进入同一个会话并尝试获取同一个对象,您应该从休眠会话中获取它而不是去数据库并且必须等待行被释放。
我不确定这是你的问题,但看起来你的代码是正确的(尽管在这个例子中你最好使用 Domain.lock(1)
同时获取和锁定它,有分别进行这两个调用没有错)。
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() 之后其他实例无法更新?或者是别的东西?还是我遗漏了什么?
您是在同一会话中呼叫 check
和 check2
吗? lock()
方法选择要更新的行(在数据库级别),但是如果您进入同一个会话并尝试获取同一个对象,您应该从休眠会话中获取它而不是去数据库并且必须等待行被释放。
我不确定这是你的问题,但看起来你的代码是正确的(尽管在这个例子中你最好使用 Domain.lock(1)
同时获取和锁定它,有分别进行这两个调用没有错)。