我正在研究一个模块,我使用悲观锁定来锁定一行。
我在服务方法中使用了以下代码:
examSession = ExamSession.lock(ID)
println "after lock " + new Date()
......
...........
examSession.addTo.........(object)
....................................
examSession.save()........
.......................................
trigger payment.......
...........................
当我点击两个浏览器中的按钮(几乎同一时间)到达服务方法代码时,我发现其他线程(第二个浏览器)在锁定语句后暂停,并且甚至不执行其后的print语句。它在3-4秒后执行,等待第一个线程完成/提交事务。但我已经读过,在悲观锁定的情况下,只有db读操作被暂停。它应该至少执行print语句。它是如何发生的?
Grails文档也没有详细指定lock()。请澄清。
答案 0 :(得分:3)
ExamSession.lock(ID)
获取(或试图获取)锁。显然,如果已经获得,执行将不会继续。
这正是悲观锁定应该做的事情,它完全按照预期的方式工作。在锁定语句之后,它不会暂停。它会暂停 lock()
,因为它无法获取排他锁。