mysql行锁详解_MySQL行锁、表锁、间隙锁详解

本文深入探讨了MySQL中InnoDB存储引擎的锁机制,通过实例展示了行锁(读写)的工作原理。从自动提交设置为手动提交后,通过两个会话窗口模拟并发操作,解释了读已提交的隔离级别以及写锁和写锁之间的冲突与阻塞。通过窗口A和B的交互,详细阐述了锁的获取与释放过程,帮助读者理解MySQL的事务与锁管理。
摘要由CSDN通过智能技术生成

前言

我们前几篇讲了索引是什么,如何使用explain分析索引使用情况,如何去优化索引,以及show profiles分析SQL语句执行资源消耗的学习。今天我们来讲讲MySQL的各种锁,这里存储引擎我们使用InnoDB

准备工作

创建表 tb_innodb_lock

drop table if exists test_innodb_lock;CREATE TABLE test_innodb_lock ( a INT (11), b VARCHAR (20)) ENGINE INNODB DEFAULT charset = utf8;insert into test_innodb_lock values (1,'a');insert into test_innodb_lock values (2,'b');insert into test_innodb_lock values (3,'c');insert into test_innodb_lock values (4,'d');insert into test_innodb_lock values (5,'e');复制代码

创建索引

create index idx_lock_a on test_innodb_lock(a);create index idx_lock_b on test_innodb_lock(b);复制代码

MySQL 各种锁演示

先将自动提交事务改成手动提交:set autocommit=0;

我们启动两个会话窗口 A 和 B,模拟一个抢到锁,一个没抢到被阻塞住了。

行锁(写&读)

A 窗口执行

update test_innodb_lock set b='a1' where a=1;复制代码

SELECT * from test_innodb_lock;复制代码

1b4eda3885689c3a467859af178900c7.png 我们可以看到 A 窗口可以看到更新后的结果

B 窗口执行

SELECT * from test_innodb_lock;复制代码

2c82dd2437e472b5fc5240a644e1ad88.png 我们可以看到 B 窗口不能看到更新后的结果,看到的还是老数据,这是因为 a = 1 的这行记录被 A 窗口执行的 SQL 语句抢到了锁,并且没有执行 commit 提交操作。所以窗口 B 看到的还是老数据。这就是 MySQL 隔离级别中的"读已提交"。

窗口 A 执行 commit 操作

COMMIT;复制代码

窗口 B 查询

SELECT * from test_innodb_lock;复制代码

7c7604d47598569931051fe8c362a860.png 这个时候我们发现窗口 B 已经读取到最新数据了

行锁(写&写)

窗口 A 执行更新 a = 1 的记录

update test_innodb_lock set b='a2' where a=1;复制代码

这时候并没有 commit 提交,锁是窗口 A 持有。

窗口 B 也执行更新 a = 1 的记录

update test_innodb_lock set b='a3' where a=1;复制代码

6a3e51a95e12649b4294246eeae06810.png 可以看到,窗口 B 一直处于阻塞状态,因为窗口 A 还没有执行 commit,还持有锁。窗口 B 抢不到 a = 1 这行记录的锁,所以一直阻塞等待。

窗口 A 执行 commit 操作

COMMIT;复制代码

窗口 B 的变化.........

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值