Hibernate(16 )_hibernate 的并发控制

本文深入探讨了Hibernate中并发控制的两种主要方式:悲观锁和乐观锁。悲观锁通过数据库的update锁实现,适用于高竞争环境;乐观锁则通过版本号检查避免冲突,提升并发性能。文章提供了具体的代码示例,展示了如何在Hibernate中实施这两种锁机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本系列博客汇总在这里: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 = 1002, t.version = t.version+ 1 where t.item_id = 1001 and t.version = 1

如有错误,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值