在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 操作会对整张表进行加锁。
留言与评论(共有 0 条评论) “” |