以下是乐观锁定的工作方式:
- 用户1开始编辑recordA -
recordA
从与版本数据库加载V
- 用户2开始编辑recordA -
recordA
从与版本数据库加载V
-完全一样,上面 - USER1节省recordA -
recordA
被保存,但Hibernate的透明补充说:
UPDATE ... SET V = V + 1 WHERe version = V
此时,Hibernate验证从数据库返回的修改记录的数量是否正好为 1 。如果查询的记录修改为0,则表示该
WHERe version =V子句未得到满足。在这种情况下,一切正常,版本设置为
V + 1(重要!)
- User2保存recordA -Hibernate所做的事情完全相同,但
V
内存中仍然有旧版本号。不幸的是,在这种情况下,WHERe version = V
由于版本为now,所以不满足条件V + 1
。查询返回0条已修改的记录,这使Hibernate(正确)认为该记录在此期间已被修改。这就是异常的意思。
所以你对此能做些什么?只需捕获异常并:
重复整个交易,但是重新加载实体(使用新版本
V + 1
),以便在更新后不会丢失最后的更改或通知用户在此期间对象已被修改,以便她可以检查新版本。
两种解决方案都很好,具体取决于您的用例。



