Hibernate 乐观锁 org.hibernate.StaleObjectStateException 异常
Hibernate乐观锁大多是基于数据版本(version)记录机制实现的。所谓的数据版本,就是为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个version字段来实现。
读取数据时,将此版本号一同读出,之后更新时,对此版本号加1。此时,将提交数据的版本号与数据库表对应记录的当前版本信息进行对比,如果提交的数据版本号大于数据库表中的当前版本号,则予以更新,否则认为是过期数据。
乐观锁 测试:
User 类:
public class User implements Serializable{ private int id; private String name; private int version; ...}
<hibernate-mapping><class name="po.User" table="t_user" lazy="false" optimistic-lock="version"><id name="id"><generator /></id> <version name="version" column="version" type="integer"/><property name="name" /> </class></hibernate-mapping>
Session session = sessionFactory.openSession();Session session2 = sessionFactory.openSession();User user = (User)session.load(User.class, new Integer(1));User user2 = (User)session2.load(User.class, new Integer(1)); Transaction tx = session.beginTransaction(); Transaction tx2 = session2.beginTransaction(); user2.setName("AAA");tx2.commit(); user.setName("BBB"); tx.commit();
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)
Hibernate: select user0_.id as id0_0_, user0_.version as version0_0_, user0_.name as name0_0_ from t_user user0_ where user0_.id=?Hibernate: update t_user set version=?, name=? where id=? and version=?Hibernate: select user0_.id as id0_0_, user0_.version as version0_0_, user0_.name as name0_0_ from t_user user0_ where user0_.id=?Hibernate: update t_user set version=?, name=? where id=? and version=?