0
点赞
收藏
分享

微信扫一扫

MySQL 原理与优化:行锁

芝婵 2022-08-14 阅读 57

MySQL 原理与优化:行锁_共享锁

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

行锁分为

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

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



MySQL 原理与优化:行锁_共享锁_02

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


MySQL 原理与优化:行锁_sql_03

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

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


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

select * from course;


MySQL 原理与优化:行锁_共享锁_04

student 表的内容如上图所示

同时查看索引情况:


MySQL 原理与优化:行锁_共享锁_05


除了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 操作会对整张表进行加锁。



MySQL 原理与优化:行锁_共享锁_06

举报

相关推荐

0 条评论