锁,主要是解决并发性问题
悲观锁,通常是由数据 库机制实现的,在整个过程中把数据锁住(查询时),只要事务不释放(提交/回滚),那么任务用户都不能查看或修改。避免更新丢失,悲观锁的并发性不好。
session的load加载时加上了lockmode.upgrade
<span style="font-size:18px;"><strong>public void testLoad1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Inventory inv = (Inventory)session.load(Inventory.class, "1001", LockMode.UPGRADE);
System.out.println("opt1-->itemNo=" + inv.getItemNo());
System.out.println("opt1-->itemName=" + inv.getItemName());
System.out.println("opt1-->quantity=" + inv.getQuantity());
inv.setQuantity(inv.getQuantity() - 200);
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}</strong></span>
悲观锁的并发性不好,不能解决高并发问题,这就需要乐观锁了。乐观锁不是锁,是冲突的一种检测手段,乐观锁比较适合于高并发情况下,因为它不锁数据。通常在数据库里加个字段或时间戳,来判断字段值。乐观锁的大多数使用采用数据版本的方式实现,一般在数据库中加入一个version字段在读取数据的时候将version读取出来,在保存数据的时候判断version的值是否小于数据库中的version值,如果小于不予更新,否则给予更新。我觉得有点类似于svn cvs的赶脚。
乐观锁只要是在映射文件里面加上对version和optimistic-lock的配置
<span style="font-size:18px;"><strong><?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.Inventory" table="t_inventory" optimistic-lock="version">
<id name="itemNo">
<generator class="assigned"/>
</id>
<version name="version"/>
<property name="itemName"/>
<property name="quantity"/>
</class>
</hibernate-mapping></strong></span>