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



