悲观锁定奇怪的行为

Pessimistic Locking strange behaviour

我正在开发一个使用悲观锁定来锁定行的模块。

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

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

当我在 2 个浏览器(几乎同时)点击一个按钮以访问服务方法代码时,我观察到另一个线程(第 2 个浏览器)在 lock 语句之后暂停并且甚至不执行它后面的 print 语句。它在等待第一个线程 finish/commit 事务 3-4 秒后执行。但我读过,在悲观锁定的情况下,只有数据库读取操作被暂停。它至少应该执行打印语句。它是如何发生的?

Grails 文档也没有详细说明 lock()。请说明。

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

这正是悲观锁定应该做的事情,并且它的工作方式完全正确。它不会暂停 after lock 语句。它暂停 lock(),因为它无法获取独占锁。