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