本系列博客汇总在这里:Hibernate 汇总


源码工程文件为:hibernate4.3_12

Hibernate(16 )_hibernate 的并发控制_悲观锁
Hibernate(16 )_hibernate 的并发控制_乐观锁_02

一、悲观锁

悲观锁不是 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);
	}
}
二、乐观锁

悲观锁的性能比较低,因为查询也被锁住,我们乐观锁可以很好解决这个问题。
Hibernate(16 )_hibernate 的并发控制_数据库_03

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 = 1002, t.version = t.version+ 1 where t.item_id = 1001 and t.version = 1

如有错误,欢迎指正!