悲观锁

当我们要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制在修改数据之前锁定,再修改的方式被称为悲观并发控制(PCC)。

之所以叫做悲观锁,是因为抱有悲观的态度去修改数据的并发控制方式,认为数据并发修改的概率比较大,所以需要在修改之前先加锁。

悲观并发控制实际上是“先取锁,再访问”的保守策略,为数据处理的安全提供了保证。

在效率上,处理加锁的机制会让数据库产生额外的开销,还会有死锁的可能性。降低并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。

悲观锁的实现方式:悲观锁的实现,依靠数据库提供的锁机制。在数据库中,悲观锁的流程如下:

在对数据修改前,尝试增加排他锁。

加锁失败,意味着数据正在被修改,进行等待或者抛出异常。

加锁成功,对数据进行修改,提交事务,锁释放。

如果我们加锁成功,有其他线程对该数据进行操作或者加排他锁的操作,只能等待或者抛出异常。

乐观锁

乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测。

相对于悲观锁,在数据库进行处理的时候,乐观锁不会使用数据库提供的锁机制,一般是增加 version 参数,记录数据版本

乐观并发控制相信事务之间的数据竞争概率非常小,因此尽可能直接操作,提交的时候才去锁定,不会产生任何锁和死锁。

上手试一试

基于 MySQL InnoDB 引擎

使用悲观锁

begin;

select quantity from products where id = 1 for update;

update products set quantity = 2 where id = 1;

commit;

以上,对 id 为 1 的产品进行修改,先通过 for update 的方式进行加锁,然后再修改。典型的悲观锁策略。

如果修改库存的逻辑发生并发,同一时间只有一个线程可以开启事务并获得 id = 1 的锁,其他事务必须等本次提交之后才能执行,这样可以保证数据不被其他事务修改。

使用排他锁会把数据锁住,不过需要注意一些基本的锁级别,MySQL InnoDB 默认行级锁。行级锁是基于索引的,如果一条 SQL 语句用不到索引是不会使用行级锁,会使用表级锁把整张表锁住。

使用乐观锁

select quantity from products where id = 1

update products set quantity = 2 where id = 1 and quantity = 3

先查询库存表当前库存数,然后更新的时候判断数据表对应数据的 quantity 与第一次取出来的是否一致,一致则更新,否则认为是过期数据。

这样实现有一个问题,线程 1 从数据库取出 quantity 为 3,线程 2 也取出同一条数据的 quantity,进行操作,变成了 2,然后又进行某些操作 变成了 3,此时线程 1 进行更新操作成功。但是这个过程有问题。

引入 version 参数,乐观锁每次在执行数据修改的操作,都会带上版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对 version 执行 +1 操作,否则就执行失败。

这样实现也有一个问题,如果真的有高并发的时候,就只有一个线程可以修改成功,就会存在大量的失败。

如果你的应用存在超高并发,这样解决也不好,因为会总让用户感知到失败。

尝试减小乐观锁力度,最大程度提高吞吐。

update products set quantity = quantity - 1 where id = 1 and quantity - 1 > 0

使用这条 SQL 语句,在执行过程中,会在一次原子操作中查询一遍 quantity 的值,并且减去 1。

简述区别

乐观锁不是真的加锁,效率高,但是要控制好锁的力度。

悲观锁依赖数据库锁,效率低。

总结

无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想。

大家要记住锁机制一定要在事务中才能生效哦。

以上是我对乐观锁与悲观锁一点基础实践,希望能和大家再深入了解了解。

本作品采用《CC 协议》,转载必须注明作者和本文链接

Hello。

laravel mysql 悲观锁_浅析乐观锁与悲观锁相关推荐

  1. 轻量级锁_并发编程实战05:锁的状态

    无锁.偏向锁 .轻量级锁和重量级锁这四种锁是指锁的状态,专门针对synchronized的.在介绍这四种锁状态之前还需要介绍一些额外的知识. 首先为什么Synchronized能实现线程同步?在回答这 ...

  2. java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

  3. 可重入锁 不可重入锁_什么是可重入锁?

    可重入锁 不可重入锁 在Java 5.0中,增加了一个新功能以增强内部锁定功能,称为可重入锁定. 在此之前,"同步"和"易失性"是实现并发的手段. public ...

  4. java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    synchronized 和 Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同 ...

  5. 可重入锁_什么是可重入锁?

    可重入锁 在Java 5.0中,增加了一个新功能以增强内部锁定功能,称为Reentrant Lock. 在此之前,"同步"和"易失"是实现并发的手段. publ ...

  6. python gil全局锁_什么是Python全局解释器锁(GIL)?

    python gil全局锁 The Python Global Interpreter Lock or GIL, in simple words, is a mutex (or a lock) tha ...

  7. java 对象锁_个人对java中对象锁与类锁的一些理解与实例

    一  什么是对象锁 对象锁也叫方法锁,是针对一个对象实例的,它只在该对象的某个内存位置声明一个标识该对象是否拥有锁,所有它只会锁住当前的对象,而并不会对其他对象实例的锁产生任何影响,不同对象访问同一个 ...

  8. mysql停止修复_浅析MySQL 8.0崩溃恢复

    本文将结合MySQL 8.0.19 分析InnoDB崩溃恢复的拉起过程,包括恢复前的准备工作,redo回放,undo回滚,以及崩溃恢复后Crash Safe DDL的实现.其中重点介绍redo的回放. ...

  9. mysql concat例子_浅析MySQL中concat以及group_concat的使用

    说明: 本文中使用的例子均在下面的数据库表tt2下执行: 一.concat()函数 1.功能:将多个字符串连接成一个字符串. 2.语法:concat(str1, str2,...) 返回结果为连接参数 ...

最新文章

  1. DWR取session,request,response
  2. 【WEB安全】轻松检测钓鱼网站的技巧
  3. 【直播】回放与PPT下载!深度学习如何用于摄影图像的处理?
  4. 【Qt】QModbusTcpClient类
  5. linux源码编译emqttd,emqtt编译及简单测试记录
  6. 循序渐进PYTHON3(十三) --8-- DJANGO之ADMIN
  7. ajax jinja,在向Flask发出jQuery AJAX请求后渲染Jinja
  8. 上传并解析XML文件
  9. 2018双一流排名 计算机,2018年42所双一流大学本硕博录取人数排名,规模优势凸显!...
  10. 《统计学》第八版贾俊平第一章课后习题及答案总结
  11. 利用公网Msf+MS17010跨网段攻击内网(不详细立马关站)
  12. 项目启动报 JDBC Driver has been forcibly unregistered
  13. element-ui表格合并数据相同行
  14. 打开window桌面文件夹路径的方法
  15. 从 sketch 中获取颜色、字体组件内容
  16. 位于本地计算机上 错误1068怎么办,错误1068怎么解决
  17. 8个3D打印机方案,低成本创造DIY的更多可能性
  18. 万事达卡、中国银行、北汽鹏龙联手 推联名信用卡
  19. Java15来了!!!一文详解JDK15新特性
  20. 教你如何使用blender+threejs搭建一个3d展厅平台 | 大帅老猿threejs特训

热门文章

  1. Python Scapy(2.3.1)文档学习(三):使用
  2. 应用宝认领应用签名_Android腾讯应用宝应用认领
  3. java开发工具排名_干货:排名前16的Java工具类
  4. 十年磨一剑,匠心打造中国人自己的网络编程架构t-io
  5. the king of fighter
  6. 3D audio 及 Virtual Surround 算法
  7. 软考信息系统监理师:2016年4月1日作业
  8. 配置alexa skill(一)
  9. Problem B Problem I
  10. 鸭脚木开花 蜜蜂大搬家