悲观锁定奇怪的行为

时间:2015-12-30 17:51:19

标签: java multithreading hibernate grails gorm

我正在研究一个模块,我使用悲观锁定来锁定一行。

我在服务方法中使用了以下代码:

examSession = ExamSession.lock(ID)
println "after lock " + new Date()
......
...........
examSession.addTo.........(object)
....................................
examSession.save()........
.......................................
trigger payment.......
...........................

当我点击两个浏览器中的按钮(几乎同一时间)到达服务方法代码时,我发现其他线程(第二个浏览器)在锁定语句后暂停,并且甚至不执行其后的print语句。它在3-4秒后执行,等待第一个线程完成/提交事务。但我已经读过,在悲观锁定的情况下,只有db读操作被暂停。它应该至少执行print语句。它是如何发生的?

Grails文档也没有详细指定lock()。请澄清。

1 个答案:

答案 0 :(得分:3)

ExamSession.lock(ID)获取(或试图获取)锁。显然,如果已经获得,执行将不会继续。

这正是悲观锁定应该做的事情,它完全按照预期的方式工作。在锁定语句之后,它不会暂停。它会暂停 lock(),因为它无法获取排他锁。