mysql锁探究

mysql版本

select version();


image.png

表数据情况

image.png

索引情况

image.png

情况一,针对主键进行操作

事务一

start transaction;
select id,a,b,c from next_key_lock_test where id = 5 for update;

事务二

start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (6,6,6,6);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (4,4,4,4);
commit;

插入id为6、4的数据不收到影响

情况二针对唯一索引a操作

事务一

start transaction;
select id,a,b,c from next_key_lock_test where a = 5 for update;

事务二

start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (7,7,7,7);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,3,3);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (88,5,3,3);
rollbock;

插入a为7、3不受影响,插入a=5的数据时,被锁住了。

情况三针对唯一索引a操作,where条件不存在

事务一

start transaction;
select id,a,b,c from next_key_lock_test where a = 4 for update;

事务二

start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (7,7,7,7);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,3,3);

插入3被锁住了


image.png

表data_lock_waits


image.png

查看表data_locks
image.png

添加了一个gap锁
测试发现(1,4]被锁住了,5由于是唯一索引直接插入不进去。

情况四 针对主键不存在的情况

事务一

start transaction;
select id,a,b,c from next_key_lock_test where id = 4 for update;
image.png

这次LOCK_DATA只有一个5
事务二

start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (7,7,7,7);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,3,3);

同样插入不了id为3的数据
基本与情况3一致,无法插入[2,4]的数据,1、5因为重复主键无法插入。

情况五 对普通索引进行操作

事务一

start transaction;
select id,a,b,c from next_key_lock_test where b = 4 for update;

事务二

start transaction;
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (7,7,7,7);
insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,3,3);

同样无法插入3的数据


image.png

基本与情况三一致
由于不存在唯一校验,试一下边界
事务二

insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (3,3,5,3);

无法插入边界值5


image.png

也无法插入边界值1

insert into `next_key_lock_test`(`id`,`a`,`b`,`c`) VALUES (100,100,1,100);

边界为[0,5]
情况六不带索引的字段
事务一

start transaction;
select id,a,b,c from next_key_lock_test where c = 4 for update;
image.png

发现任意数据都无法插入,应该是记录中多了一条


image.png

的原因。

共享锁 lock in share mode效果基本一致,只是X变为S。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 锁的概念 之前我们学习过多线程,多线程当中如果想保证数据的准确性是如何实现的呢?没错,通过同步实现。同步就相当于是...
    码农Kkio阅读 347评论 0 1
  • 是不是很多人都对 MySQL 加行级锁的规则搞的迷迷糊糊,一会是 next-key 锁,一会是间隙锁,一会又是记录...
    前端架构巴拉啦阅读 151评论 0 0
  • 行锁的实现 在Innodb存储引擎中,行锁有3种实现方式,分别是: Record Lock Gap Lock Ne...
    Coding小聪阅读 1,859评论 0 0
  • MySql笔记,笔记分为四个部分:1.MySQL架构与SQL执行流程[https://www.jianshu.co...
    javacoo阅读 2,584评论 2 15
  • 事务 什么是事务?维基百科的定义:事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由 一个有限的数据库操...
    WEIJAVA阅读 1,359评论 0 7