天天看點

Hibernate(16 )_hibernate 的并發控制

本系列部落格彙總在這裡:Hibernate 彙總

并發控制

  • 一、悲觀鎖
  • 二、樂觀鎖
源碼工程檔案為:hibernate4.3_12
Hibernate(16 )_hibernate 的并發控制
Hibernate(16 )_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
           

繼續閱讀