一、相关名词

  • 表级锁:锁定整个表。
  • 页级锁:锁定一页。
  • 行级锁:锁定一行。
  • 间隙锁(Next-Key):锁定不存在记录的间隙。
  • 共享锁:S 锁,MyISAM 叫做读锁。
  • 排他锁:X 锁,MyISAM 叫做写锁。
  • 悲观锁:抽象性,不真实存在这个锁。
  • 乐观锁:抽象性,不真实存在这个锁。

二、InnoDB 与 MyISAM

Mysql 在5.5之前默认使用 MyISAM 存储引擎,之后使用 InnoDB 。查看当前存储引擎:

show variables like '%storage_engine%';

MyISAM 操作数据都是使用的表锁,你更新一条记录就要锁整个表,导致性能较低,并发不高。当然同时它也不会存在死锁问题。

而 InnoDB 与 MyISAM 的最大不同有两点:一是 InnoDB 支持事务;二是 InnoDB 采用了行级锁。也就是你需要修改哪行,就可以只锁定哪行。

索引分为主键索引和非主键索引两种,如果一条 sql 语句操作了主键索引,Mysql 就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 会通过隐藏的聚簇索引来对记录加锁。也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,实际效果跟表锁一样。因为没有了索引,找到某一条记录就得扫描全表,要扫描全表,就得锁定表。

三、行锁

在 Mysql 中,行级锁并不是直接锁记录,而是锁索引。InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。 InnoDB 这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁!

即便在条件中使用了索引字段,但是否使用索引来检索数据是由 MySQL 通过判断不同执行计划的代价来决定的,如果 MySQL 认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB 将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查 SQL 的执行计划,以确认是否真正使用了索引。

四、间隙锁

当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB 会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB 也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。

举例来说,假如 emp 表中只有 101 条记录,其 empid 的值分别是 1、2、…、100、101,下面的 SQL:

Select * from emp where empid > 100 for update;

该 SQL 是一个范围条件的检索,InnoDB 不仅会对符合条件的 empid 值为 101 的记录加锁,也会对 empid 大于 101(这些记录并不存在)的“间隙”加锁。

InnoDB 使用间隙锁的目的,一方面是为了防止幻读,以满足相关隔离级别的要求。对于上面的例子,要是不使用间隙锁,如果其他事务插入了 empid 大于 100 的任何记录,那么本事务如果再次执行上述语句,就会发生幻读。

很显然,在使用范围条件检索并锁定记录时,InnoDB 这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待。因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件。

还要特别说明的是,InnoDB 除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB 也会使用间隙锁!

转载于:https://blog.csdn.net/localhost01/article/details/78720727

(SAW:Game Over!)

MySQL / 各种锁相关推荐

  1. mysql乐观锁处理超卖_通过乐观锁解决库存超卖的问题

    前言 在通过多线程来解决高并发的问题上,线程安全往往是最先需要考虑的问题,其次才是性能.库存超卖问题是有很多种技术解决方案的,比如悲观锁,分布式锁,乐观锁,队列串行化,Redis原子操作等.本篇通过M ...

  2. mysql left join超时,MySQL 行锁超时排查方法优化

    一.大纲 #### 20191219 10:10:10,234 | com.alibaba.druid.filter.logging.Log4jFilter.statementLogError(Log ...

  3. mysql乐观锁总结和实践

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任何场景,它也有它存在的一些 ...

  4. 一文读懂MySQL事务锁、事务级别

    锁 性能分:乐观(比如使用version字段比对,无需等待).悲观(需要等待其他事务) 乐观锁,如它的名字那样,总是认为别人不会去修改,只有在提交更新的时候去检查数据的状态.通常是给数据增加一个字段来 ...

  5. MySQL InnoDB锁机制全面解析分享

    写在前面:在设计新零售供应链wms(仓库管理系统)库存模块时,为了防止并发情况对库存的影响,查阅了一些资料,对InnoDB锁机制有了更全面的了解,在此做出分享,如有疏漏望不吝指正,愿共同进步!(此篇为 ...

  6. mysql 行锁 超时_技术分享 | MySQL 行锁超时排查方法优化

    作者:xuty 本文来源:原创投稿 * 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 一.大纲 #### 20191219 10:10:10,234 | com.ali ...

  7. Mysql 数据库锁表的原因和解决方法

    Mysql 数据库锁表的原因和解决方法 参考文章: (1)Mysql 数据库锁表的原因和解决方法 (2)https://www.cnblogs.com/xinruyi/p/11108795.html ...

  8. mysql更新锁机制_mysql查询更新时的锁表机制分析

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制. 一.概述 MySQL有三种锁 ...

  9. mysql的锁表问题

    SHOW PROCESSLIST查看数据库中表的状态,是否被锁: kill id   //杀掉被锁的表 ================================================ ...

  10. mysql乐观锁总结和实践--转

    原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...

最新文章

  1. VS2005 和 SQL Server 2005 安装顺序不同会发生什么?
  2. 基于CSDN完成TEASOFT的MOOC编辑整理
  3. easyui dialog 中嵌入html页面
  4. 浅谈物联网时代智能停车发展趋势
  5. 【译】Node.js 日志打印指南
  6. go-callvis:Go调用关系图(call graph)
  7. 使用ViewSwitcher模拟手机屏幕应用分屏和切换
  8. java web相关试卷_JavaWeb试卷四
  9. hdu 1754 线段树 水题 单点更新 区间查询
  10. 【雷达通信】基于matlab GUI雷达定位模拟【含Matlab源码 304期】
  11. 五百强各大行业简介+面试流程+tips
  12. 天津大学学硕和专硕的区别_想考天大化工的研究生,学硕和专硕区别大吗
  13. opencv半透明填充不规则区域
  14. 语言设置修复计算机 没有光盘,如何在Windows中创建系统修复光盘
  15. PCB电路板EN 45545-2:2020最新标准的测试要求
  16. 保龄球计分java代码_保龄球记分程序用C#该怎么写
  17. 服务器dns被劫持如何修复,电脑DNS被劫持如何解决?电脑DNS被劫持的解决方法
  18. 闲鱼如何高效打造一个多业务、低侵入的搜索链路
  19. 【软考】2020下半年软件设计师 易错知识点(1)
  20. 二氧化硅纳米微球光子晶体乳液聚合聚苯乙烯核壳结构/中空二氧化硅/钛纳米微球的制备方法

热门文章

  1. 《python核心编程》读书笔记--第15章 正则表达式
  2. shell脚本调试中打开set选项
  3. C语言程序设计 数组,结构体和指针练习题
  4. Microsoft SQL Server 2005 安装程序错误解疑
  5. python语法问题
  6. docker-compose部署prometheus
  7. HBase基本操作命令整理
  8. 蓝点lilac / ContextMenuManager:win10右键菜单清理工具
  9. 【收藏】goland报错:报错package xxx is not in GOROOT or GOPATH 或者 cannot find package “xxx“ in any of
  10. vue商城项目开发:浏览器自动访问、路由样式修改及定义和导入组件