悲观锁定奇怪的行为
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()
,因为它无法获取独占锁。
我正在开发一个使用悲观锁定来锁定行的模块。
我在服务方法中使用了以下代码:
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()
,因为它无法获取独占锁。