MySQL 原理与优化:行锁
在 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 操作会对整张表进行加锁。
版权声明: 本文为 InfoQ 作者【崔皓】的原创文章。
原文链接:【http://xie.infoq.cn/article/10e41a1713ae4dc1e66c478f1】。文章转载请联系作者。
评论