事务中的悲观锁和乐观锁
为了避免对对象同步操作时候产生的数据不一致问题,我们对对象采用加锁机制
悲观锁:从读取的时候开始加锁,直到修改完成。
缺点:读取完以后,用户修改过程缓慢,造成同步性降低。
乐观锁:给每条记录添加版本号,用来区别。两人同时编辑时候,假设获取的版本号都为1,编辑完提交的时候,版本号为2,第一个提交完以后,数据库版本号为2,第二个提交的时候对比版本号就会报错。
给Users加上版本号
Users.java
Users.hbm.xml
test.java
模拟两个线程同步操作,更新user
运行结果如下
Hibernate: insert into Users (ver, name, birthday) values (?, ?, ?)
Hibernate: select users0_.id as id0_0_, users0_.ver as ver0_0_, users0_.name as name0_0_, users0_.birthday as birthday0_0_ from Users users0_ where users0_.id=?
Hibernate: update Users set ver=?, name=?, birthday=? where id=? and ver=?
Hibernate: update Users set ver=?, name=?, birthday=? where id=? and ver=?
Exception in thread "main" org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [domain.Users#1]
第二个提交的事务内报错,数据库内字段修改为new2。