乐观锁与悲观锁

2 篇文章 0 订阅
乐观锁和悲观锁机制,是在多用户环境并发控制得两种锁机制

乐观锁
在关系数据库管理系统中,乐观并发控制(又名乐观锁)是一种并发控制得方法。它假设 多用户并发的事务在处理时不会彼此相互影响,各事务能够在不产生锁的情况下处理各自影响的那部分数据。在提交数据更新之前,每个事务会先检查在该事务读取数据后,在没有其他事务又修改了该数据。 如果其它事务又更新的话,正在提交的事务就会回滚

乐观并发控制得事务包括以下阶段
1、读取:事务将数据读入缓存,这时系统会给事务分派一个时间戳
2、校验:事务执行完毕后,进行提交。这时同步校验所有事务,如果事务所读取的数据在读取之后有被其它事务修改,则产生冲突,事务被中断回滚
3、写入:通过校验阶段后,将更新的数据写入数据库。

乐观并发控制多数用于数据争用不大,冲突较少的环境中。这种环境中,偶尔回滚事务的成本会低于读取数据时锁定数据的成本,因此可以获得比其它并发控制方法更高的吞吐量。

相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。
数据版本,为数据增加的一个版本标识。当读取数据时,将版本标识的值一同读出,数据每更新一次,同时对版本标识进行更新。当我们提交更新的时候,判断数据库表对应的当前版本信息与第一次取出来的版本标识进行比对,如果数据库表当前版本号与第一次取出来的版本标识值相等,则可以更新,否则认为是过期数据。
实现数据版本有两种方式,第一种是使用版本号,第二种是使用时间戳。使用版本号实现乐观锁。

乐观锁的优点与不足
乐观并发控制相信事务之间的数据竞争的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。如果直接简单这么做,还是有可能会遇到不可预期的结果,例如两个事务都读取了数据库的某一行,经过修改以后写回数据库,这时就遇到了问题。


悲观锁
在关系数据库管理系统里,悲观并发控制(又名悲观锁)是一种并发控制得方法,它可以阻止一个事务以影响其它用户的方式来修改数据。如果一个事务执行的操作读某行数据应用了锁,那只有当这个事务把锁释放,其它事务才能够执行与该锁冲突的操作。
悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁包换数据的成本要低于回滚事务的成本的环境中。

悲观并发控制得优缺点
悲观并发控制实际上是先读取锁再访问的保守策略,为数据处理的安全提供了保证,但是效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会。另外,在只读行数据处理中由于不会产生冲突,也没必要使用锁,这样做只能增加系统负载,还有会降低了并行性,一个事务如果锁定了某行数据,其它事务就必须等待该事务处理完才可以处理那行数。



总结:
乐观锁使用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。相反,如果经常发生冲突,上层应用会不断进行retry,这样反而降低了性能,所以这种情况下用悲观锁比较适合。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wyu-jat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值