悲观锁与乐观锁

本文介绍了悲观锁和乐观锁的概念及其应用场景。悲观锁通过显示地锁定数据资源来避免并发问题,但可能影响性能;乐观锁依赖于版本控制机制,假设数据不会被其他事务同时修改。文章还详细说明了两种锁的实现方式,并提供了Hibernate中实现乐观锁的具体方法。

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

悲观锁: 指在应用程序中显示地为数据资源加锁. 悲观锁假定当前事务操纵数据资源时, 肯定还会有其他事务同时访问该数据资源, 为了避免当前事务的操作受到干扰, 先锁定资源. 尽管悲观锁能够防止丢失更新和不可重复读这类并发问题, 但是它会影响并发性能, 因此应该谨慎使用悲观锁.

 

乐观锁: 乐观锁假定当前事务操纵数据资源时, 不会有其他事务同时访问该数据资源, 因此完全依靠数据库的隔离级来自动管理锁的工作. 应用程序采用版本控制手段来避免可能出现并发问题.

 

悲观锁有两种实现方式:

一: 在应用程序中显示指定采用数据库系统的独占锁来锁定数据资源.

二: 在数据库表中增加一个表明记录状态的LOCK字段, 当它取值为'Y' 时, 表示该记录已经被某个事务锁定, 如果为N 表明该记录处于空闲状态, 事务可以访问它.

 

当事务执行select 语句的时候, 默认情况下, 数据库系统会采用共享锁来锁定查询的记录. 此外MYSQL Oracle Ms SQL都支持以下形式的select 语句:

 

select ... for update

 

以上语句显示的指定采用独占锁来锁定查询的记录.

 

在Hibernate应用中, 当通过Session的get() 和load() 方法来加载一个对象时, 可以采用以下的方式声明使用悲观锁:

session.get(XXX.class, new Long(1), LockMode.UPGRADE)

 

 

 利用Hibernate的版本控制来实现乐观锁

 

乐观锁是由应用程序提供的一种机制, 这种机制既能保证多个事务并发访问数据, 又能防止第二类丢失更新. 可以利用hibernate的版本控制功能来实现乐观锁.

 

在数据库中加入一个字段, VERSION, 每次更新通过session中的实体对象的version属性进行更新, 如session中version为0, 则where version = 0. 否则将抛出异常.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值