Mysql 系列文章主页

===============

Tips:在阅读本文前,最好先阅读 这篇(Mysql锁机制--行锁)文章~

在上篇文章中,我们看到InnoDB默认的行锁可以使得操作不同行时不会产生相互影响、不会阻塞,从而很好的解决了多事务和并发的问题。但是,那得基于一个前提,即 Where 条件中使用上了索引;反之,如果没有使用上索引,则是全表扫描、全部阻塞。本文就以实际例子来演示这种情景。

1 准备数据

1.1 建表

DROP TABLE IF EXISTS employee;
CREATE TABLE IF NOT EXISTS employee (
id INT PRIMARY KEY auto_increment,
name VARCHAR(40),
money INT
)ENGINE INNODB;

注意:ENGINE 是 INNODB(因为 InnoDB 才支持行锁)

1.2 插入数据

INSERT INTO employee(name, money) VALUES('', 10000);
INSERT INTO employee(name, money) VALUES('', 10000);

提示:'1001' & '1002' 既是字符串,也是数字(后面会用到)

2 没有建索引的情形

到现在为止,没有显示地为 Employee 表建立索引。

2.1 准备

还是老规矩,两个会话(终端),左边是白色背景的,右边是黑色背景的,并且均设置 autocommit = 0

2.2 测试

2.2.1 在左侧会话中执行更新

Sql 语句:

UPDATE employee SET money = money + 10000 WHERE name = '';

结果:

2.2.2 在右侧会话中执行更新

Sql 语句:

UPDATE employee SET money = money + 5000 WHERE name = '';

结果:如下图所示,更新操作被阻塞了!

2.2.3 在左侧执行 COMMIT 命令

提示:执行的时候注意查看右边Sql语句执行情况的变化

2.2.4 右侧的Sql语句正常执行了,耗时 18.19 秒

2.2.5 右侧也执行一下提交

2.2.6 左侧查看一下数据

2.2.7 右侧查看一下数据

两边结果相同,且正确。

但问题是,左侧操作的是 name = '1001' 记录而右侧操作的是 name = '1002' 记录,右侧还是被阻塞了,说明,左侧的更新操作锁住了全表!究其原因,是因为 name 字段上没有索引!

2.3 结论

当 Where 查询条件中的字段没有索引时,更新操作会锁住全表!

3 索引失效的情形

现在来演示索引失效的情形;要想索引失效,前提得要有索引啊;于是,先建立索引。

3.1 建立索引

CREATE INDEX idx_name ON employee(name);

3.2 有索引情况下的行锁演示

提示:还是老规矩,两个会话(终端),左边是白色背景的,右边是黑色背景的,并且均设置 autocommit = 0

3.2.1 在左侧会话中执行更新

Sql 语句:

UPDATE employee SET money = money + 10000 WHERE name = '';

结果:

3.2.2 在右侧会话中执行更新

Sql 语句:

UPDATE employee SET money = money + 5000 WHERE name = '';

结果:

立即执行,没有被阻塞!

3.2.3 左右两侧分别执行提交

3.2.4 左侧查看结果

3.2.5 右侧查看结果

两边的结果相同,且正确。

3.2.6 结论

可以看到,在有索引的情况下,更新不同的行,InnoDB 默认的行锁不会阻塞。

3.3 索引失效情况下的行锁演示

提示:还是老规矩,两个会话(终端),左边是白色背景的,右边是黑色背景的,并且均设置 autocommit = 0

3.3.1 在左侧会话中执行更新

Sql 语句:(注意:name = 1001 的 1001 两边没有加单引号)

UPDATE employee SET money = money + 10000 WHERE name = 1001;

结果:

3.3.2 在右侧会话中执行更新

Sql 语句:

UPDATE employee SET money = money + 5000 WHERE name = '';

结果:

被阻塞!说明左侧会话锁住了整张表!

3.3.3 左侧执行提交(注意查看右侧会话中Sql执行的情况变化)

3.3.4 查看右侧会话

右侧会话中的更新操作被执行,耗时 20.68 秒

3.3.5 右侧也提交

3.3.6 左侧查看结果

3.3.7 右侧查看结果

两边结果相同,且正确。

3.3.8 结论

Where 条件中的查询字段虽然有索引,但是索引失效时(本例子中是字符串没有加单引号),InnoDB 默认的行锁更新操作变为表锁。

4 结论

没有索引或者索引失效时,InnoDB 的行锁变表锁

原因:Mysql 的行锁是通过索引实现的!

Mysql锁机制--索引失效导致行锁变表锁的更多相关文章

  1. Mysql在InnoDB引擎下索引失效行级锁变表锁案例

    先做好准备,创建InnoDB引擎数据表,并添加了相应的索引 DROP TABLE IF EXISTS `innodb_lock`; CREATE TABLE `innodb_lock` ( `a` ) ...

  2. MySQL优化篇系列文章(二)——MyISAM表锁与InnoDB锁问题

    我可以和面试官多聊几句吗?只是想... MySQL优化篇系列文章(基于MySQL8.0测试验证),上部分:优化SQL语句.数据库对象,MyISAM表锁和InnoDB锁问题. 面试官:咦,小伙子,又来啦 ...

  3. SQL优化 MySQL版 - 避免索引失效原则(一)

    避免索引失效原则(一) 精力有限,剩余的失效原则将会在 <避免索引失效原则(二)>中连载出来,请谅解 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 避免索引失效的一些原 ...

  4. SQL优化 MySQL版 - 避免索引失效原则(二)

    避免索引失效原则(二) 注:继上一篇文章继续讲解: 避免索引失效原则(一)https://www.cnblogs.com/StanleyBlogs/p/10482048.html#4195062 作者 ...

  5. MySQL 行锁 表锁机制

    MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑.遇到了可别乱踩.通过本章内容,带你学习MySQL的行锁 ...

  6. [转]MySQL 表锁和行锁机制

    本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...

  7. MySQL高级第四章——MySQL的锁机制

    一.概述 1.定义 锁是计算机协调多个进程或线程并发访问某一资源的限制. 2.分类 操作类型来分: 读锁(共享锁)和写锁(排它锁) 数据粒度来分: 表锁和行锁 二.三锁 1.表锁——偏读 特点: 偏向 ...

  8. 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁

    转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...

  9. mysql优化二之锁机制

    mysql优化二之锁机制 mysql提供了锁机制和MVCC机制来保证并发操作的安全性,这里主要讨论锁机制, MVCC见下篇文章 mysql的锁按照锁粒度可分为行锁与表锁,按照操作类型划分可读锁和写锁 ...

随机推荐

  1. kafka--- consumer 消费消息

    1. consumer API kafka 提供了两套 consumer API: 1. The high-level Consumer API 2. The SimpleConsumer API 其 ...

  2. Django form表单

    Form介绍 之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来.与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入, ...

  3. 集合之深入理解HashMap

    Hashmap是一种非常常用的.应用广泛的数据类型 1.hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个 ...

  4. Ecplise 配置本地 https 测试

    今天做项目,需要关联Office 365.为了实现Office365的用户邮件信息与项目的实时同步,需要建立webhook订阅. Office 365 API 连接  https://graph.mi ...

  5. Web标准的简单理解 不同内核浏览器的差异以及浏览器渲染简介(转)

    Web标准是一系列标准的集合.这些标准大概分三方面:结构.表现和行为.结构化主要有HTML, XHTML和XML,表现主要有CSS,行为标准主要包括对象模型,如 W3C DOM.ECMAScript等 ...

  6. building a new horizon

    昨天是4月14日,也是我的23岁生日.正好去参加GDG举办的WTM,这次的主题是building a new horizon. 写一下印象深刻的分享者和她们的闪光点. 1.羡辙-从灵感到落地 羡辙是在 ...

  7. .NET MD5 加密

    using System; using System.Security.Cryptography; using System.Text; namespace Md5Demo { /// <sum ...

  8. 0316-关于js 注意事项

    js:脚本语言,控制网页的行为(特效,表单验证) /* 这是多行注释 *///这是单行注释 js问题及注意事项: JavaScript 对大小写是敏感的 多写注释.提示性文字要说明白 定义变量时最好加 ...

  9. SSO-单点统一登录系统的设计与实现

    本文主要基于web类应用展开讨论,提供的是一种通用机制和方法,所以不论何种技术栈都可进行相应的具体实现. 实现目标 可以在相同或跨域环境下完成各应用的统一登录/注销 方案原理 本质上是采用了web应用 ...

  10. [LeetCode] Maximum Product of Three Numbers 三个数字的最大乘积

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...