写点什么

MySQL 原理与优化:行锁

作者:崔皓
  • 2022 年 8 月 14 日
    湖北
  • 本文字数:541 字

    阅读完需:约 2 分钟


在 MySQL 中行锁在 Innodb 引擎中存在。

行锁分为

共享锁(S):允许一个事务读一行记录,组织其他事务获得相同数据集的排他锁。

排他锁(X):允许获取排他锁的事务更新数据,组织其他事务获取相同数据的共享锁和排他锁。



在如下图的操作中,SQL 会对应不同的行锁行为



行锁也就是对表中一行记录进行加锁,只是 select 语句是不会加锁的。针对 select XX lock in share mode 的情况会对行加共享锁(S),针对 select XXX from update ,以及 insert、update、delete 这些修改的语句都会加上排他锁(X)

针对同一条记录而言,如果是共享锁,那么其他的事务都可以读但是不能写。如果是排他锁(X),那么其他的事务既不能读也不能写


需要注意的是这里的行锁如果针对条件索引,那么只有针对有索引的列进行过滤的修改操作才能锁定一行记录,否会锁表。来看行锁的例子,存在 student 表

select * from course;



student 表的内容如上图所示

同时查看索引情况:



除了 id 没有其他的索引

开启事务执行如下 sql

begin;

update student set name = 'Java' where name = '韦一笑';

此时执行另外一个事务

begin;

update student set name = "hello" where id =1;

发现无法修改,由于第一个事务中的 where 条件是 name ,而 name 不是 student 表的索引因此 对 where name 进行的 update 操作会对整张表进行加锁。



发布于: 刚刚阅读数: 4
用户头像

崔皓

关注

还未添加个人签名 2019.01.02 加入

还未添加个人简介

评论

发布
暂无评论
MySQL 原理与优化:行锁_崔皓_InfoQ写作社区