秋招了,之前看过的MySQL的很多都已经记不清楚了,跟着小林的图解MySQL回顾一遍,记录一些。
先启动MySQL,然后创建如下的数据库:(tips:注意要通过管理员模式去运行MySQL)
创建事务A:
执行:select * from user where id = 1 for update;
此时通过执行:select * from performance_schema.data_locks\G;查看锁的信息,
此时会有两个锁,第一个锁是表级锁:
LOCK_TYPE是锁的级别,TABLE表示表级锁
LOCK_MODE是锁的类型,IX表示X型的意向锁
第二个锁:
LOCK_TYPE为RECORD,表示行级锁
LOCK_MODE为X,REC_NOT_GAP表示记录锁,
LOCK_DATA表示锁的范围,此时表示id为1的这一条记录。
那如果查询id不存在的情况呢?下面我们继续看:
执行:select * from user where id = 2 for update;
数据库响应:Empty set,表示不存在这条记录,
去查看事务的锁情况,如下:
LOCK_MODE为X,GAP,表示间隙锁
此时新开一个事务B,插入id=3的一条新的记录,会被阻塞
因为此时有间隙锁,范围是(1,5),也就是说右边界是LOCK_DATA的值,左边界是这条记录的上一条记录,也就是1.