org.hibernate.StaleObjectStateException:
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.xx.xx:11]说明操作的对象时应用了乐观锁机制,或者定义pojo时定义了version字段;或者同时对同一对象(同一ID)进行了操作
场景1:
乐观锁和悲观锁基本概念
在数据库并发操作时,为了保证数据的正确性,我们会做一些并发处理,主要就是加锁。
在加锁的选择上,有几种方式,悲观锁,乐观锁。
- 悲观锁,简单的理解就是:把需要的数据全部加锁,在事务提交之前,这些数据全部不可读取和修改。
- 乐观锁,使用对数据进行版本校验和比较,来对保证本次的更新时最新的,否则就失败。
因此在乐观锁下,当对同一版本对象进行更新操作或类似操作会抛出异常,提示该行已经被其他事务删除或者修改过了,本次修改无法生效,这样就保证了数据的一致性。
解决:
- 每次用form提交数据时,把version也一并提交上来,commit提交事务;
- 从数据库中把version查出来,赋给实体对象,再更新;
参考来源于:
http://how2j.cn/k/hibernate/hibernate-optimistic-lock/101.html#nowhere