LZH天 2012-10-18
Hibernate对悲观锁和乐观锁的支持,主要解决并发问题。
数据库隔离级别越高,并发性越差。
锁具有排他性,锁住别人就访问不了。
悲观锁:并发性低,悲观锁一般依赖于数据库机制实现的,在整个过程中将数据锁定,其他任何用户都不能读取或修改,hibernate做了一些封装。
一般适合短事务情况。
实际上是冲突检测。
悲观锁实现:
session.beginTransaction();
// LockMode 锁模式
Inventory inv =(Inventory)session.load(Inventory.class, 1, LockMode.UPGRADE);
System.out.println("itemname="+ inv.getItemName());
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">
<generatorclass="native"/>
</id>
//必须放到id后面
<version name="version"/>
<propertyname="itemName"/>
<propertyname="quantity"/>
</class>
</hibernate-mapping>