【发布时间】:2023-03-29 14:26:01
【问题描述】:
我正在开发一个模块,我使用悲观锁定来锁定一行。
我在服务方法中使用了下面的代码:
examSession = ExamSession.lock(ID)
println "after lock " + new Date()
......
...........
examSession.addTo.........(object)
....................................
examSession.save()........
.......................................
trigger payment.......
...........................
当我在 2 个浏览器中(几乎同时)点击一个按钮以到达服务方法代码时,我观察到另一个线程(第二个浏览器)在 lock 语句后暂停,甚至不执行它后面的 print 语句。它在等待第一个线程完成/提交事务 3-4 秒后执行。但是我已经读过,在悲观锁定的情况下,只有数据库读取操作被暂停。它应该至少执行了 print 语句。它是怎么发生的?
Grails 文档也没有详细说明 lock()。请澄清。
【问题讨论】:
-
ExamSession.lock(ID)是什么? -
ExamSession 是一个领域类(相当于hibernate实体类)。 lock() 在具有指定 ID 的行上获取锁。
标签: java multithreading hibernate grails grails-orm