本系列博客汇总在这里:Hibernate 汇总
源码工程文件为:hibernate4.3_12
悲观锁不是 hibernate 的锁,这是数据库的 update 锁。Select * from item for update
。Hibernate 就是用的这种机制,在查询上上锁。
public void updateStock()
{
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try
{
// 使用悲观锁查询,如果一个请求在查询时,另一个请求被阻塞在外
Item item = (Item) session.load(Item.class, 1, LockOptions.UPGRADE);
item.setStock(item.getStock() - 2);
tx.commit();
} catch (Exception e)
{
e.printStackTrace();
tx.rollback();
} finally
{
HibernateUtils.closeResource(session);
}
}
二、乐观锁
悲观锁的性能比较低,因为查询也被锁住,我们乐观锁可以很好解决这个问题。
public void optLock()
{
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
try
{
// 乐观锁
Item item = (Item) session.load(Item.class, 1);
item.setStock(item.getStock() - 2);
tx.commit();
} catch (Exception e)
{
e.printStackTrace();
tx.rollback();
} finally
{
HibernateUtils.closeResource(session);
}
}
Select * from t_item where item_id = 1001;
1001 iphone 100 1
Update t_item set t.stock = 100 – 2, t.version = t.version+ 1 where t.item_id = 1001 and t.version = 1
如有错误,欢迎指正!