1. 表锁的读锁(MyISAM)

概念:针对同一份数据,多个读操作可以同时进行而不会互相影响。

显式加读锁:lock table 表名 read;,改命令为显式添加,MyISAM在执行查询默认会隐式添加读锁
显式释放读锁:unlock tables;,MyISAM默认查询结束后释放读锁

情景:客户端1 把表先用读锁锁起来了

操作 客户端1 客户端2
X 阻塞等待
X 阻塞等待
X 阻塞等待

结论:读锁会阻塞写,但是不会阻塞读


2. 表锁的写锁(MyISAM)

概念:当前操作没有完成之前,它会阻断整张表的其他写锁和读锁。

显式加写锁:lock table 表名 write;,MyISAM在执行查询默认会隐式添加写锁
显式释放写锁:unlock tables;,MyISAM默认查询结束后释放写锁

情景:客户端1 把表先用写锁锁起来了

操作 客户端1 客户端2
阻塞等待
阻塞等待
阻塞等待
阻塞等待

结论:写锁既会阻塞写,也会阻塞读


3. 行锁的写锁(InnoDB)

情景:客户端1的事务由于需要update,把 id=3 这一行的数据用行锁锁住了,且客户端1的事务未提交

操作 客户端1 客户端2
id=3的行 增删改 阻塞等待
id=3的行 查
对其他行增删改查

结论:对于增删改,InnoDB会自动给记录行加上行锁。对于查询操作,InnoDB不会加锁。


4. 间隙锁

概念:间隙锁也称为GAP锁,InnoDB引擎遇到写操作中存在范围的条件,会自动对范围内的所有值上行锁写锁,即使这个有些值在表中并没有对应的记录。如果此时有了对空缺值的增删改操作,就会进入阻塞状态

情景:InnoDB表dept,有dno、dname、location三个字段,dno和dname有普通索引,默认行锁。(方便起见,两个客户端均关闭自动提交set autocommit = 0;,模拟两个事务的并发执行)

dno dname location
99 aa aa
100 bb bb
101 cc cc
102 dd dd
105 ee ee
客户端1 客户端2
update dept set location=“test” where dno > 100 insert into dept values(103, ‘aa’, ‘vv’);(阻塞等待)

结论:间隙锁我们应该要尽可能的避免,方法就是尽可能的缩小或精确写操作的条件范围


5. 死锁

情景:InnoDB表dept,有dno、dname、location三个字段,dno和dname有普通索引,默认行锁。(方便起见,两个客户端均关闭自动提交set autocommit = 0;,模拟两个事务的并发执行)

时间线 客户端1 客户端2
1 update dept set dname=“111” where dno=101; update dept set dname=“222” where dno=102;
2 update dept set dname=“333” where dno=102; update dept set dname=“444” where dno=101;
  • 说明:客户端1 给101行加了行锁,客户端给102行加了行锁,客户端1需要102行的行锁来修改102行数据,客户端2需要101行的行锁修改101行数据,二者事务都没有提交,因此谁也不能释放锁,造成死锁。

6. 悲观锁与乐观锁

把锁比作枪,把数据库比作银行,主人公为客户端

  • 悲观锁概念:我去银行取钱,我觉得所有人都是坏人,所以我取钱时时刻刻都揣着枪小心前行,这样就没人来抢我的钱了。
  • 乐观锁概念:我去银行取钱,我觉得一般不会有人来抢钱,所以当有人来抢我钱的时候我才把枪从包里拿出来。那么乐观锁又是怎么发现有人来抢钱的呢?一般设立一个version字段,自己取完钱就在该字段+1。在自己取钱前会先查一下这个字段的值,取钱操作前还会查询一遍该值是否和之前获取的值一致,不一致说明有人要来抢钱了,我就撤退,回滚。

时时刻刻举枪瞄准四周去取钱的效率肯定比背着包走路去取钱低,因此悲观锁的执行效率不如乐观锁,但是却安全可靠。乐观锁效率高,但是一旦被发现钱被抢了需要重新进行回滚,因此具有一些回滚动作的开销。

结论:悲观锁上来就上锁,乐观锁发现问题才上锁,前者效率比较低但是安全可靠适用于并发量低的场景,后者效率高但是出问题后需要进行业务回滚适用于并发量高的场景。


附. 表的锁情况查询

  • 查看有哪些表被锁住了:show open tables;,InUse为1的就是正在使用被锁住了。

以上为个人理解,如果有不对的地方欢迎批评指出~

浅显易懂的理解SQL各种锁(基于MYSQL 8.0.28)相关推荐

  1. 基于MySQL 8.0 对事务的深度理解

    基于MySQL 8.0 对事务的深度理解 一.MySQL中事务隔离级别 事务的隔离级别有哪些? 隔离级别 脏读 不可重复读 幻读(虚读) 未提交读(Read uncommitted) 可能 可能 可能 ...

  2. 国产麒麟系统KylinOS Server V10 SP2安装MySQL 8.0.28—RPM包安装

    最近工作重点转向信创领域后就开始研究国产化操作系统对各种数据库的适配方案,期间发现一些很有价值的内容,特意整理成文章分享出来. 此文档讲述如何在国产麒麟操作系统KylinOS Server V10 S ...

  3. ubuntu 安装docker mysql 8.0.28

    ubuntu 安装docker mysql 8.0.28 1. ubuntu 版本信息更新系统 webrx@us:~$ sudo apt update [sudo] webrx 的密码: 命中:1 h ...

  4. mysql 8.0.28版本安装配置方法图文教程

    mysql 8.0.28版本安装配置方法图文教程 从 Mysql 官网下载 mysql 下载完成后直接双击进行安装,打开后的页面如下所示: 选择自定义custom,接着下一步 将MySQL Serve ...

  5. mysql 8.0.28安装教程(超简单)

    背景:目前在网络上的mysql安装教程,针对的mysql版本较老,或者安装教程使用的mysql软件多是解压版本,解压过程简单,但是后续配置相对比较麻烦,并且可能因为缺少某些C++依赖包而导致程序无法正 ...

  6. mysql 8 sql server_终于将 SQL Server 成功迁移至 MySQL8.0 啦!!!

    之前一直使用 SQL Server 作为主数据库而不是 MySQL ,原因之一是单机 SQL Server 性能比 MySQL 强很多,另一个原因是之前客户的系统管理员大多只有 SQL Server ...

  7. MySQL 8.0 Server层最新架构详解

    简介:本文基于MySQL 8.0.25源码进行分析和总结.这里MySQL Server层指的是MySQL的优化器.执行器部分.我们对MySQL的理解还建立在5.6和5.7版本的理解之上,更多的是对比P ...

  8. mysql+8.0+新特性_MySQL 8.0备受瞩目的新特性大放送!

    原标题:MySQL 8.0备受瞩目的新特性大放送! 作者介绍 杨奇龙,目前就职于有赞科技,负责数据库运维工作,熟悉MySQL性能优化.故障诊断.性能压测. MySQL于 2016-09-12正式发布8 ...

  9. MySQL 8.0原理与实战一网打尽,甲骨文数据库专家硬刚5年之作

    一.MySQL 8.0势在必行 据权威数据库技术排名网站DB-Engines今年4月的最新数据,MySQL是全球最流行的开源数据库,没有之一.在所有数据库排名中,MySQL仅次于Oracle,&quo ...

  10. 终于将 SQL Server 成功迁移至 MySQL8.0 啦!!!

    之前一直使用 SQL Server 作为主数据库而不是 MySQL ,原因之一是单机 SQL Server 性能比 MySQL 强很多,另一个原因是之前客户的系统管理员大多只有 SQL Server ...

最新文章

  1. ospf 环回口的路由条目_OSPF (4)
  2. Socketserver 笔记
  3. Tensorflow object detection API 搭建物体识别模型
  4. 前端每日实战:142# 视频演示如何用 CSS 的 Grid 布局创作一枚小鸡邮票
  5. 创建VLAN的两种方法
  6. ORA-12154: TNS:could not resolve the connect identifier specified. Solved.
  7. java 自定义 operator_见微知著——从自定义类型的operator==说起
  8. css grid随页面大小_你现在可以玩下这 5 个 CSS 新功能
  9. 如何用JS实现泛玉米解析
  10. Python——如何屏蔽函数内部的print输出
  11. JSP技术-02-内置对象/作用域/EL表达式/JSTL标签库
  12. Excel VBA编程实战宝典PDF扫描版电子书介绍
  13. 车牌号对应归属地及城市JSON带简码
  14. C++高级编程资料汇总(参考手册+电子书+编程思想+算法分析)
  15. 使用POI导出Excel时,关于设置带有多行表头表格自动宽度的问题解决办法
  16. hdu1069 最长下降子列
  17. MySQL said: Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/...
  18. 如何在 Excel 中筛选数据透视表中的数据?
  19. 220805我文明的体现在书法艺术上此对标志LOGO设计产生的积极深远影响分析
  20. win10 C盘右边是OEM分区扩容的解决办法

热门文章

  1. 公钥,私钥 和数字证书
  2. linux里关于Tab/Ctrl/Shift/Insert的快捷键
  3. 老式十字锁自动碰锁,换锁芯
  4. SQLException: Invalid value for getInt() - ‘XXX‘
  5. Real-Time Rendering——9.9.4 Rough-Surface Subsurface Models粗糙表面地下模型
  6. dToF与iToF技术解析
  7. 关闭伽卡他卡电子教室自动启动项
  8. 1395786-30-7,DBCO Maleimide,DBCO-Mal
  9. ipa java_Java 解析 IPA 文件,读取 Info.plist 信息
  10. 计算机应用能力考试ppt2003,[全国专业技术人员计算机应用能力考试PPT2003题库版.doc...