hibernate学习笔记第18讲-悲观锁-乐观锁
?
Hibernate对悲观锁和乐观锁的支持,主要解决并发问题。
数据库隔离级别越高,并发性越差。
锁具有排他性,锁住别人就访问不了。
悲观锁:并发性低,悲观锁一般依赖于数据库机制实现的,在整个过程中将数据锁定,其他任何用户都不能读取或修改,hibernate做了一些封装。
一般适合短事务情况。
实际上是冲突检测。
悲观锁实现:
??????????????????????????? session.beginTransaction();
// LockMode 锁模式
??????????????????????????? Inventory inv =(Inventory)session.load(Inventory.class, 1, LockMode.UPGRADE);
??????????????????????????? System.out.println("itemName="+ inv.getItemName());
??????????????????????????? System.out.println("quantity="+ inv.getQuantity());
??????????????????????????? inv.setQuantity(inv.getQuantity()- 200);
??????????????????????????? session.update(inv);
??????????????????????????? session.getTransaction().commit();
?
乐观锁:并发性好,使用的比较多,
一般采用数据版本记录机制(version)实现,在数据库中加一个version字段,类似cvs管理,通过版本号来管理。版本低的不允许更新数据。每更新一次版本号会跟着变化。
还可以采用时间戳方式管理乐观锁。
乐观锁实现:
publicclass Inventory {
?
???????? private int itemNo;
????????
???????? private String itemName;
????????
???????? private int quantity;
????????
???????? private int version;
…….
}
映射关系:
<hibernate-mapping>
<classname="com.bjsxt.hibernate.Inventory" table="t_inventory" optimistic-lock="version">
????????????? <id name="itemNo">
?????????????????????? <generatorstyle="margin-left: 10.5pt; text-align: left;">????????????? </id>
//必须放到id后面
????????????? <version name="version"/>
????????????? <propertyname="itemName"/>
????????????? <propertyname="quantity"/>
???? </class>
</hibernate-mapping>