常不建议使用悲观锁定,就数据库方面的性能而言,这是非常昂贵的。你提到的问题(代码部分)尚不清楚,例如:
- 如果你的代码同时被多个线程访问。
- 你如何创建
session
对象(不确定是否使用Spring)?
hibernate会话对象不是线程安全的。因此,如果有多个线程访问同一个会话并尝试更新同一个数据库实体,则你的代码可能最终会出现这种错误情况。
因此,这里发生的事情是,有多个线程尝试更新同一实体,一个线程成功,当下一个线程提交数据时,它看到其已被修改并最终抛出
StaleObjectStateException。
编辑:
在Hibernate中有一种使用Pessimistic Locking 的方法。但是这种机制似乎存在一些问题。但是,我偶然发现了一个hibernate状态的错误(HHH-5275)。该错误中提到的情况如下:
两个线程正在读取同一数据库记录。这些线程中的一个应使用悲观锁定,从而阻止另一个线程。但是两个线程都可以读取数据库记录,从而导致测试失败。
这与你所面临的非常接近。如果这不起作用,请尝试此操作,我能想到的唯一方法是使用本机SQL查询,你可以在其中使用查询在postgres数据库中实现悲观锁定SELECT FOR UPDATE。



