广告
返回顶部
首页 > 资讯 > 数据库 >【MySQL】锁之InnoDB
  • 852
分享到

【MySQL】锁之InnoDB

【MySQL】锁之InnoDB 2020-11-14 22:11:59 852人浏览 绘本
摘要

纸上得来终觉浅,绝知此事要躬行。 InnoDB行锁 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 InnoDB 实现了以下两种类型的行锁。 共享锁(S):又称为读锁,简称S锁,共享锁就是多个

【MySQL】锁之InnoDB

纸上得来终觉浅,绝知此事要躬行。

InnoDB行

开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

InnoDB 实现了以下两种类型的行锁。

  • 共享锁(S):又称为读锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
  • 排他锁(X):又称为写锁,简称X锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁(包括共享锁和排他锁),但是获取排他锁的事务是可以对数据就行读取和修改。

可以通过以下语句显示给记录集加共享锁或排他锁 。

共享锁(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

排他锁(X) :SELECT * FROM table_name WHERE ... FOR UPDATE

对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁(X);
对于普通SELECT语句,InnoDB不会加任何锁;

行锁案例

测试前仍然准备相关测试表和数据,注意表的存储引擎为InnoDB:

create table test_innodb_lock(
	id int(11),
	name varchar(16),
	sex varchar(1)
)engine = innodb default charset=utf8;

insert into test_innodb_lock values(11,"100","1");
insert into test_innodb_lock values(3,"3","1");
insert into test_innodb_lock values(4,"400","0");
insert into test_innodb_lock values(5,"500","1");
insert into test_innodb_lock values(6,"600","0");
insert into test_innodb_lock values(7,"700","0");
insert into test_innodb_lock values(8,"800","1");
insert into test_innodb_lock values(9,"900","1");
insert into test_innodb_lock values(1,"200","0");

create index idx_test_innodb_lock_id on test_innodb_lock(id);
create index idx_test_innodb_lock_name on test_innodb_lock(name);

创建完成,我们看一下表结构和表数据,方便后面操作查看:

mysql> desc test_innodb_lock;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  | MUL | NULL    |       |
| name  | varchar(16) | YES  | MUL | NULL    |       |
| sex   | varchar(1)  | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)


mysql> select * from test_innodb_lock;
+------+------+------+
| id   | name | sex  |
+------+------+------+
|   11 | 100  | 1    |
|    3 | 3    | 1    |
|    4 | 400  | 0    |
|    5 | 500  | 1    |
|    6 | 600  | 0    |
|    7 | 700  | 0    |
|    8 | 800  | 1    |
|    9 | 900  | 1    |
|    1 | 200  | 0    |
+------+------+------+
9 rows in set (0.00 sec)

行锁基本演示

Session-1 Session-2
  关闭自动提交功能        关闭自动提交功能
 可以正常的查询出全部的数据    可以正常的查询出全部的数据
查询 id 为 3 的数据 查询 id 为 3 的数据
更新 id 为 3 的数据,但是不提交 更新id为3 的数据, 处于等待状态
通过 commit, 提交事务 解除阻塞,更新正常进行
以上, 操作的都是同一行的数据,接下来,演示不同行的数据 :
更新 id 为 3 数据,正常的获取到行锁 , 执行更新 ; 由于与Session-1 操作不是同一行,获取当前行锁,执行更新;

索引行锁升级为表锁

如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,实际效果跟表锁一样。

查看当前表的索引 :

show  index  from test_innodb_lock ;

接下来我们看一个例子,当索引失效的时候,行锁升级为表锁的过程:

Session-1 Session-2
关闭事务的自动提交       关闭事务的自动提交
执行更新语句 执行更新语句, 但处于阻塞状态
提交事务 解除阻塞,执行更新成功
 执行提交操作

以上两个客户端对一行数据进行修改时,由于执行更新时,name字段本来为varchar类型, 我们是作为int类型使用,存在类型转换,索引失效,最终行锁变为表锁,导致Session-2更新数据处于等待状态。

间隙锁的危害

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

下面是一个间隙锁的案例:

Session-1 Session-2
      关闭事务自动提交           关闭事务自动提交
根据 id 范围更新数据
插入id为2的记录, 出于阻塞状态
      提交事务
解除阻塞 , 执行插入操作
提交事务

由于Session-1的插入操作是一个范围,我们表中存在id不连续的情况,导致在更新时不仅会加排它锁,还会在当前访问增加间隙锁,导致Session-2在插入元素时处于等待状态。

InnoDB 行锁争用情况

查看行锁竞争情况:

show  status like "innodb_row_lock%";

  • Innodb_row_lock_current_waits: 当前正在等待锁定的数量
  • Innodb_row_lock_time: 从系统启动到现在锁定总时间长度
  • Innodb_row_lock_time_avg:每次等待所花平均时长
  • Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间
  • Innodb_row_lock_waits: 系统启动后到现在总共等待的次数

总结

InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面带来了性能损耗可能比表锁会更高一些,但是在整体并发处理能力较高。但是,InnoDB的行级锁也是一把双刃剑,当我们使用不当的时候,可能会让InnoDB的整体性能下降。

优化建议:

  • 尽可能通过索引来完成数据操作,避免无索引行锁升级为表锁。
  • 合理设计索引,尽量缩小锁的范围
  • 尽可能减少索引条件,及索引范围,避免间隙锁
  • 尽量控制事务大小,减少锁定资源量和时间长度
  • 尽可使用低级别事务隔离(但是需要业务层面满足需求)
您可能感兴趣的文档:

--结束END--

本文标题: 【MySQL】锁之InnoDB

本文链接: https://www.lsjlt.com/news/6578.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【MySQL】锁之InnoDB
    纸上得来终觉浅,绝知此事要躬行。 InnoDB行锁 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 InnoDB 实现了以下两种类型的行锁。 共享锁(S):又称为读锁,简称S锁,共享锁就是多个...
    99+
    2020-11-14
    【MySQL】锁之InnoDB
  • MySQL之InnoDB下的锁问题
    目录背景知识获取InnoDB行锁争用情况InnoDB的行锁模式及加锁方法下面是使用 lock in share mode加共享锁的例子下面是使用for update加排他锁的例子InnoDB行锁的实现方式在不通...
    99+
    2023-08-11
    MySQL InnoDB MySQL InnoDB下锁
  • mysql锁官方文档与理解之InnoDB锁
        This section describes lock types used by InnoDB. 翻译:本节描述了InnoDB使用的锁类型。 Shared and Exclusive Locks(共享锁和排他锁) Int...
    99+
    2021-05-07
    mysql锁官方文档与理解之InnoDB锁 数据库入门 数据库基础教程 数据库 mysql
  • MySQL之InnoDB中锁的情况分析
    这篇文章主要讲解了“MySQL之InnoDB中锁的情况分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL之InnoDB中锁的情况分析”吧!mysq...
    99+
    2022-10-19
  • InnoDB事务锁之行锁-insert加锁-隐式锁
    ...
    99+
    2022-10-18
  • mysql innodb的行锁(5) --next-Key 锁
    间隙锁 next-key, 是针对范围条件不存在的记录上锁,避免不可重复读和幻象读。 如果是 read committed 的隔离级别,则不存在此问题。 所以: 我们在开发中,如果使用 repeatable...
    99+
    2022-10-18
  • Mysql技术内幕之InnoDB锁的深入讲解
    前言 自7月份换工作以来,期间一直在学习MySQL的相关知识,听了一些视频课,但是一直好奇那些讲师的知识是从哪里学习的。于是想着从书籍中找答案。毕竟一直 看视频也不是办法,不能形成自己的知识。于是想着看书汲取知识,看...
    99+
    2022-05-10
    mysql innodb锁 mysql查innodb
  • MySQL知识点之InnoDB中的行级锁是什么
    今天小编给大家分享一下MySQL知识点之InnoDB中的行级锁是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下...
    99+
    2022-10-19
  • MySQL45讲之InnoDB加锁规则 - flowers
    本文介绍 MySQL InnoDB 的加锁规则,以及分析加锁时,一些需要注意的点。 前言 本文介绍 MySQL InnoDB 的加锁规则,以及一些需要注意的点。 总结 两个原则,两个优化,一个...
    99+
    2018-08-28
    MySQL45讲之InnoDB加锁规则 - flowers
  • MySQL InnoDB 锁的相关总结
    1.  Shared and Exclusive Locks shared lock (译:共享锁) exclusive lock (译:排它锁、独占锁) InnoDB实现了标准的行级锁,其中有两种类型的锁...
    99+
    2022-05-16
    MySQL InnoDB InnoDB锁
  • Mysql-InnoDB锁的示例分析
    小编给大家分享一下Mysql-InnoDB锁的示例分析,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!锁类型行级锁锁模式只有LOCK_S 和LOCK_X,其他的 FLAG 用于锁的描述,如前述 ...
    99+
    2022-10-18
  • MySQL的InnoDB锁机制介绍
    这篇文章主要介绍“MySQL的InnoDB锁机制介绍”,在日常操作中,相信很多人在MySQL的InnoDB锁机制介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL的...
    99+
    2022-10-18
  • MySQL中InnoDB锁机制分析
    本篇内容介绍了“MySQL中InnoDB锁机制分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • MySQL InnoDB如何应付死锁
    死锁是事务处理型数据库系统的一个经典问题,但是它们并不是很危险的, 除非它们如此地频繁以至于你根本处理不了几个事务。 当因死锁而产生了回滚时,你通常可以在你的应用程序中重新发出一个事务即可。 InnoDB...
    99+
    2022-10-18
  • MySQL InnoDB行锁优化建议
    InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表级锁定的。当系统并发量比较高的时候,InnoDB...
    99+
    2022-10-18
  • InnoDB事务锁之行锁-delete流程update阶段加锁
    1、介绍 delete流程分search和update两个阶段。在search阶段对聚集索引记录加锁,参考上一篇文章。在update阶段会对聚集索引记录打上delete标签,然后search二级索引...
    99+
    2022-10-18
  • MySQL中innodb行锁怎么实现
    在MySQL中,InnoDB引擎通过使用锁来实现行级锁。行锁可以通过以下几种方式来实现:1. 自动行锁:InnoDB引擎会根据需要自...
    99+
    2023-10-09
    MySQL
  • 如何理解MySQL 5.5 InnoDB表锁
    本篇文章为大家展示了如何理解MySQL 5.5 InnoDB表锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 对于没有索引的表,MyS...
    99+
    2022-10-19
  • mysql innodb的行锁举例分析
    这篇文章主要讲解了“mysql innodb的行锁举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql innodb的行锁举例分析”吧! ...
    99+
    2022-10-19
  • 怎么理解mysql innodb的行锁
    这篇文章主要讲解了“怎么理解mysql innodb的行锁”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解mysql innodb的行锁”吧! ...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作