什么是悲观锁和乐观锁 -- 转载

什么是悲观锁和乐观锁

最近在学习 Mysql原理与优化 看到这篇文章,再此记录下,本篇为转载。
转载连接:https://zhuanlan.zhihu.com/p/31537871

1、什么悲观锁?

顾名思义,悲观锁是基于一种悲观的态度类来防止一切数据冲突,它是以一种预防的姿态在修改数据之前把数据锁住,然后再对数据进行读写,在它释放锁之前任何人都不能对其数据进行操作,直到前面一个人把锁释放后下一个人数据加锁才可对数据进行加锁,然后才可以对数据进行操作,一般数据库本身锁的机制都是基于悲观锁的机制实现的;

特点:可以完全保证数据的独占性和正确性,因为每次请求都会先对数据进行加锁, 然后进行数据操作,最后再解锁,而加锁释放锁的过程会造成消耗,所以性能不高;

手动加悲观锁:读锁LOCK tables test_db read释放锁UNLOCK TABLES;

写锁:LOCK tables test_db WRITE释放锁UNLOCK TABLES;
在这里插入图片描述

2、什么是乐观锁?

乐观锁是对于数据冲突保持一种乐观态度,操作数据时不会对操作的数据进行加锁(这使得多个任务可以并行的对数据进行操作),只有到数据提交的时候才通过一种机制来验证数据是否存在冲突(一般实现方式是通过加版本号然后进行版本号的对比方式实现);

特点:乐观锁是一种并发类型的锁,其本身不对数据进行加锁通而是通过业务实现锁的功能,不对数据进行加锁就意味着允许多个请求同时访问数据,同时也省掉了对数据加锁和解锁的过程,这种方式因为节省了悲观锁加锁的操作,所以可以一定程度的的提高操作的性能,不过在并发非常高的情况下,会导致大量的请求冲突,冲突导致大部分操作无功而返而浪费资源,所以在高并发的场景下,乐观锁的性能却反而不如悲观锁。

乐观锁实现形式:

表A 字段
在这里插入图片描述
现在有两个请求同时操作表A

操作1先查询出需要检索的数据为:
在这里插入图片描述
操作2也查询出需要检索的数据为:
在这里插入图片描述
操作1把Name字段数据修改成lisi 比操作2先提交;

此时提交操作1会把之前查询到的version与现在的数据的version进行比较,版本相同则可以提交,版本不同则视为数据过期:

SQL语句:update A set Name=lisi,version=version+1 where ID=#{id} and version=#{version}

此时数据库变成了如下
在这里插入图片描述
那么最后操作2修改了数据来提交的时候是以操作1同样的方式,当然最后肯定不能提交成功,因为他手里的版本号和现在数据库里的版本号不匹配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值