MySQL锁使用示例

环境:

  • MySQL版本:8.0.27
  • 隔离级别:RR

基础数据

CREATE TABLE t5
(
    id int(11) NOT NULL,
    c  int(11) DEFAULT NULL,
    d  int(11) DEFAULT NULL,
    PRIMARY KEY (id),
    KEY c (c)
) ENGINE = InnoDB;
insert into t5
values (0, 0, 0),
       (5, 5, 5),
       (10, 10, 10),
       (15, 15, 15),
       (20, 20, 20),
       (25, 25, 25);

【1】MySQL 表级锁的四种类型使用示例

表共享读锁 (S锁)

场景:数据库备份时允许其他会话读取但不能修改

-- 会话1
LOCK TABLES t5 READ ;  -- 加共享读锁
-- 此时可以执行SELECT但不能执行INSERT/UPDATE/DELETE

-- 会话2 (其他连接)
SELECT * FROM t5;    -- 允许执行
UPDATE t5 SET d = d + 1 WHERE id = 5;  -- 被阻塞,直到锁释放

注意:SHARED_WRITE 和 SHARED_READ_ONLY 是元数据锁(MDL)。类似 Innodb 锁中的 IX 和 IS 锁。

死锁排查方案:

select * from sys.schema_table_lock_waits;
select *from performance_schema.events_statements_current;
select * from performance_schema.threads where THREAD_ID = 49;
select * from performance_schema.metadata_locks;

表排他写锁 (X锁)

场景:执行数据迁移时需要完全独占表

-- 会话1
LOCK TABLES t5 WRITE;  -- 加排他写锁
-- 可以执行任何操作
-- 解锁
UNLOCK TABLES;

-- 会话2 (其他连接)
SELECT * FROM t5;    -- 被阻塞
UPDATE t5 SET d = d + 1 WHERE id = 5;  -- 被阻塞,直到锁释放

死锁排查:同上述方法一致

意向共享锁 (IS锁)

场景:事务准备读取某些行前的标记

-- 会话1
BEGIN;
SELECT * FROM t5 WHERE id = 5 LOCK IN SHARE MODE;
-- 自动先获取表的IS锁,再获取行的S锁

-- 会话2
SELECT * FROM t5 where id = 5;    -- 允许执行
UPDATE t5 SET d = d + 1 WHERE id = 5;  -- 被阻塞,直到锁释放

-- 此时在另一个会话可以观察到:
SHOW ENGINE INNODB STATUS\G
...
---TRANSACTION 1234, ACTIVE
... TABLE LOCK table `test`.`orders` trx id 1234 lock mode IS
... RECORD LOCKS space id 56 page no 3 n bits 72 index PRIMARY trx id 1234 lock mode S

死锁排查:

-- 持有锁类型
select * from sys.innodb_lock_waits;
select * from performance_schema.data_locks where ENGINE_TRANSACTION_ID in (31756, 31761);
select * from performance_schema.threads where THREAD_ID in (49, 50);
select * from performance_schema.events_statements_history where THREAD_ID = 49 order by EVENT_ID desc ;

意向排他锁 (IX锁)

场景:事务准备修改某些行前的标记

-- 会话1
BEGIN;
SELECT * FROM t5 WHERE id = 5 FOR UPDATE;
-- 自动先获取表的IX锁,再获取行的X锁

-- 会话2
SELECT * FROM t5 where id = 5;    -- 被阻塞
UPDATE t5 SET d = d + 1 WHERE id = 5;  -- 被阻塞,直到锁释放

-- 此时在另一个会话可以观察到:
SHOW ENGINE INNODB STATUS\G
...
---TRANSACTION 1235, ACTIVE
... TABLE LOCK table `test`.`orders` trx id 1235 lock mode IX
... RECORD LOCKS space id 56 page no 3 n bits 72 index PRIMARY trx id 1235 lock mode X

死锁排查:同上述方法一致

【2】MySQL 行级锁的类型使用示例

记录锁(Record Lock)

排他记录锁(X锁)

-- 会话1
BEGIN;
SELECT * FROM t5 WHERE id = 5 FOR UPDATE;
-- 自动先获取表的IX锁,再获取行的X锁

-- 会话2
SELECT * FROM t5 where id = 5;    --被阻塞
UPDATE t5 SET d = d + 1 WHERE id = 5;  -- 被阻塞,直到锁释放

共享记录锁(S锁)

-- 会话1
BEGIN;
SELECT * FROM t5 WHERE id = 10 LOCK IN SHARE MODE;
-- 自动先获取表的IS锁,再获取行的S锁

-- 会话2
SELECT * FROM t5 where id = 10;    -- 允许执行
UPDATE t5 SET d = d + 1 WHERE id = 10;  -- 被阻塞,直到锁释放
-- 锁分析
select * from performance_schema.data_locks;

会话 2 锁分析

SQL2:

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140563598155776:1085:1405634751532803181063146demot5nullnullnull140563475153280TABLEIXGRANTEDnull
INNODB140563598155776:20:4:4:1405634751503683181063146demot5nullnullPRIMARY140563475150368RECORDX,REC_NOT_GAPWAITING10
INNODB140563598154968:1085:14056347514718442203857486562461202demot5nullnullnull140563475147184TABLEISGRANTEDnull
INNODB140563598154968:20:4:4:14056347514419242203857486562461202demot5nullnullPRIMARY140563475144192RECORDS,REC_NOT_GAPGRANTED10

间隙锁(Gap Lock)

防止幻读,锁定记录之间的间隙:

-- 会话1
BEGIN;
SELECT * FROM t5 WHERE id >3 AND id < 7 FOR UPDATE;

-- 会话2 
insert into t5 values (2, 2, 2); -- 阻塞
UPDATE t5 SET d = d + 1 WHERE id = 5; -- 阻塞
-- 锁分析
select * from performance_schema.data_locks;

会话 2 锁分析

SQL1:

THREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
6386demot5nullnullnull140563475153280TABLEIXGRANTEDnull
6386demot5nullnullPRIMARY140563475150368RECORDX,GAP,INSERT_INTENTIONWAITING5
61173demot5nullnullnull140563475147184TABLEIXGRANTEDnull
61173demot5nullnullPRIMARY140563475144192RECORDXGRANTED5
61173demot5nullnullPRIMARY140563475144536RECORDX,GAPGRANTED10

SQL2:

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140563598155776:1085:1405634751532803180763122demot5nullnullnull140563475153280TABLEIXGRANTEDnull
INNODB140563598155776:20:4:3:1405634751503683180763122demot5nullnullPRIMARY140563475150368RECORDX,REC_NOT_GAPWAITING5
INNODB140563598154968:1085:1405634751471843179961173demot5nullnullnull140563475147184TABLEIXGRANTEDnull
INNODB140563598154968:20:4:3:1405634751441923179961173demot5nullnullPRIMARY140563475144192RECORDXGRANTED5
INNODB140563598154968:20:4:4:1405634751445363179961173demot5nullnullPRIMARY140563475144536RECORDX,GAPGRANTED10

临键锁(Next-Key Lock)

InnoDB默认锁机制,锁定记录+前间隙:

BEGIN;
SELECT * FROM t5 WHERE id <= 20 FOR UPDATE;
-- 锁定范围: (-∞,0],(0,5],(5,10],(10,20]

UPDATE t5 SET d = d + 1 WHERE id = 0; -- 阻塞
UPDATE t5 SET d = d + 1 WHERE id = 20; -- 阻塞
UPDATE t5 SET d = d + 1 WHERE id = 25; -- 正常执行
insert into t5 values (2, 2, 2); -- 阻塞

会话 2 锁分析

SQL1:

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140563598155776:1085:1405634751532803182663247demot5nullnullnull140563475153280TABLEIXGRANTEDnull
INNODB140563598155776:20:4:2:1405634751503683182663247demot5nullnullPRIMARY140563475150368RECORDX,REC_NOT_GAPWAITING0
INNODB140563598154968:1085:1405634751471843182561260demot5nullnullnull140563475147184TABLEIXGRANTEDnull
INNODB140563598154968:20:4:2:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED0
INNODB140563598154968:20:4:3:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED5
INNODB140563598154968:20:4:4:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED10
INNODB140563598154968:20:4:5:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED15
INNODB140563598154968:20:4:6:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED20

SQL2:

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140563598155776:1085:1405634751532803182763258demot5nullnullnull140563475153280TABLEIXGRANTEDnull
INNODB140563598155776:20:4:6:1405634751503683182763258demot5nullnullPRIMARY140563475150368RECORDX,REC_NOT_GAPWAITING20
INNODB140563598154968:1085:1405634751471843182561260demot5nullnullnull140563475147184TABLEIXGRANTEDnull
INNODB140563598154968:20:4:2:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED0
INNODB140563598154968:20:4:3:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED5
INNODB140563598154968:20:4:4:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED10
INNODB140563598154968:20:4:5:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED15
INNODB140563598154968:20:4:6:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED20

SQL4:

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140563598155776:1085:1405634751532803183263306demot5nullnullnull140563475153280TABLEIXGRANTEDnull
INNODB140563598155776:20:4:3:1405634751503683183263306demot5nullnullPRIMARY140563475150368RECORDX,GAP,INSERT_INTENTIONWAITING5
INNODB140563598154968:1085:1405634751471843182561260demot5nullnullnull140563475147184TABLEIXGRANTEDnull
INNODB140563598154968:20:4:2:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED0
INNODB140563598154968:20:4:3:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED5
INNODB140563598154968:20:4:4:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED10
INNODB140563598154968:20:4:5:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED15
INNODB140563598154968:20:4:6:1405634751441923182561260demot5nullnullPRIMARY140563475144192RECORDXGRANTED20

【3】加锁原则

  • 加锁基本单位都是 next-key lock,查找过程中访问到的对象才会加锁。
  • 索引等值查询,给唯一索引加锁时,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。
  • 索引等值查询,给唯一索引加锁时,next-key lock 退化为行锁。

注意**BUG: **在唯一索引(主键)的范围查询中,InnoDB会对满足条件的记录加记录锁,并对范围之后的间隙加间隙锁以防止插入。

【4】实战

主键索引等值查询

begin ;
SELECT * FROM t5 WHERE id=5 for update ;

锁分析

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140563598154968:1085:140563475147184319508579demot5nullnullnull140563475147184TABLEIXGRANTEDnull
INNODB140563598154968:20:4:3:140563475144192319508579demot5nullnullPRIMARY140563475144192RECORDX,REC_NOT_GAPGRANTED5

主键索引间隙锁

-- session 1
begin ;
select * from t5 where id = 6 for update ; -- (5,10)

-- session 2
UPDATE t5 SET d = d + 1 WHERE id = 10; -- 正常执行
insert into t5 value (4, 4, 4); -- 正常执行
 insert into t5 value (7, 7, 7); -- 阻塞

会话 2 锁分析

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140563598155776:1085:140563475153280319338650demot5nullnullnull140563475153280TABLEIXGRANTEDnull
INNODB140563598155776:20:4:4:140563475150368319338650demot5nullnullPRIMARY140563475150368RECORDX,GAP,INSERT_INTENTIONWAITING10
INNODB140563598154968:1085:140563475147184319248521demot5nullnullnull140563475147184TABLEIXGRANTEDnull
INNODB140563598154968:20:4:4:140563475144192319248521demot5nullnullPRIMARY140563475144192RECORDX,GAPGRANTED10

主键索引范围锁

范围一:

-- session 1:
begin ;
select * from t5 where id >= 5 and id <10 for update ; -- (0,5],(5,10] -> 5,(5,10);

-- session 2:
insert into t5 value (2, 2,2); -- 正常执行
insert into t5 value (7, 7, 7); -- 阻塞 
UPDATE t5 SET d = d + 1 WHERE id = 10; -- 正常执行

会话 2 锁分析

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140563598155776:1085:140563475153280319398698demot5nullnullnull140563475153280TABLEIXGRANTEDnull
INNODB140563598155776:20:4:4:140563475150368319398698demot5nullnullPRIMARY140563475150368RECORDX,GAP,INSERT_INTENTIONWAITING10
INNODB140563598154968:1085:140563475147184319348550demot5nullnullnull140563475147184TABLEIXGRANTEDnull
INNODB140563598154968:20:4:3:140563475144192319348550demot5nullnullPRIMARY140563475144192RECORDX,REC_NOT_GAPGRANTED5
INNODB140563598154968:20:4:4:140563475144536319348550demot5nullnullPRIMARY140563475144536RECORDX,GAPGRANTED10

范围二:

-- session1
begin ;
select * from t5 where id > 5 and id <=10 for update ; -- (5,10]

-- session2
insert into t5 value (2, 2,2); -- 正常执行
insert into t5 value (7, 7, 7); -- 阻塞 
insert into t5 value (11, 11, 11); -- 正常执行
UPDATE t5 SET d = d + 1 WHERE id = 10; -- 阻塞
UPDATE t5 SET d = d + 1 WHERE id = 5; -- 正常执行

会话 2 锁分析

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140563598155776:1085:1405634751532803195486122demot5nullnullnull140563475153280TABLEIXGRANTEDnull
INNODB140563598155776:20:4:4:1405634751503683195486122demot5nullnullPRIMARY140563475150368RECORDX,REC_NOT_GAPWAITING10
INNODB140563598154968:1085:1405634751471843195185108demot5nullnullnull140563475147184TABLEIXGRANTEDnull
INNODB140563598154968:20:4:4:1405634751441923195185108demot5nullnullPRIMARY140563475144192RECORDXGRANTED10

范围 3:

begin;
select * from t5 where id <= 10 for update ;

锁分析

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140697851113472:1085:1406977599901443310958292demot5nullnullnull140697759990144TABLEIXGRANTEDnull
INNODB140697851113472:20:4:2:1406977599872323310958292demot5nullnullPRIMARY140697759987232RECORDXGRANTED0
INNODB140697851113472:20:4:3:1406977599872323310958292demot5nullnullPRIMARY140697759987232RECORDXGRANTED5
INNODB140697851113472:20:4:4:1406977599872323310958292demot5nullnullPRIMARY140697759987232RECORDXGRANTED10

非唯一索引等值查询

-- session1:
begin ;
select * from t5  where c=5 for update ;

-- session2:
insert into t5 value (2, 2,2); -- 阻塞
insert into t5 value (7, 7, 7); -- 阻塞
UPDATE t5 SET d = d + 1 WHERE c = 5; -- 阻塞
UPDATE t5 SET d = d + 1 WHERE c = 10; -- 正常执行
UPDATE t5 SET d = d + 1 WHERE id = 5;  -- 阻塞
UPDATE t5 SET d = d + 1 WHERE id = 10; -- 正常执行

会话 2 锁分析

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140697851114280:1085:140697759996128330405013demot5nullnullnull140697759996128TABLEIXGRANTEDnull
INNODB140697851114280:20:5:3:140697759993216330405013demot5nullnullc140697759993216RECORDX,GAP,INSERT_INTENTIONWAITING5, 5
INNODB140697851113472:1085:140697759990144330394978demot5nullnullnull140697759990144TABLEIXGRANTEDnull
INNODB140697851113472:20:5:3:140697759987232330394978demot5nullnullc140697759987232RECORDXGRANTED5, 5
INNODB140697851113472:20:4:3:140697759987576330394978demot5nullnullPRIMARY140697759987576RECORDX,REC_NOT_GAPGRANTED5
INNODB140697851113472:20:5:4:140697759987920330394978demot5nullnullc140697759987920RECORDX,GAPGRANTED10, 10

非唯一索引间隙锁

-- session1:
begin ;
select * from t5  where c=6 for update ;

-- session2:
UPDATE t5 SET d = d + 1 WHERE c = 5; -- 正常执行
UPDATE t5 SET d = d + 1 WHERE id = 5; -- 正常执行
UPDATE t5 SET d = d + 1 WHERE id = 10; -- 正常执行
UPDATE t5 SET d = d + 1 WHERE c = 10; -- 正常执行
insert into t5 value (7, 7, 7); -- 阻塞

会话 2 锁分析

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140697851114280:1085:1406977599961283306750181demot5nullnullnull140697759996128TABLEIXGRANTEDnull
INNODB140697851114280:20:5:4:1406977599932163306750181demot5nullnullc140697759993216RECORDX,GAP,INSERT_INTENTIONWAITING10, 10
INNODB140697851113472:1085:1406977599901443305249107demot5nullnullnull140697759990144TABLEIXGRANTEDnull
INNODB140697851113472:20:5:4:1406977599872323305249107demot5nullnullc140697759987232RECORDX,GAPGRANTED10, 10

非唯一索引范围锁

范围一:

-- session1:
begin ;
select * from t5 where c >= 5 and c <10 for update ;

-- session2:
UPDATE t5 SET d = d + 1 WHERE id = 10; -- 正常执行
UPDATE t5 SET d = d + 1 WHERE c = 10; -- 阻塞
insert into t5 value (2, 2,2); -- 阻塞

会话 2 锁分析

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140697851112664:1085:140697759984048330845784demot5nullnullnull140697759984048TABLEIXGRANTEDnull
INNODB140697851112664:20:5:3:140697759981056330845784demot5nullnullc140697759981056RECORDX,GAP,INSERT_INTENTIONWAITING5, 5
INNODB140697851113472:1085:1406977599901443308358108demot5nullnullnull140697759990144TABLEIXGRANTEDnull
INNODB140697851113472:20:5:3:1406977599872323308358108demot5nullnullc140697759987232RECORDXGRANTED5, 5
INNODB140697851113472:20:5:4:1406977599872323308358108demot5nullnullc140697759987232RECORDXGRANTED10, 10
INNODB140697851113472:20:4:3:1406977599875763308358108demot5nullnullPRIMARY140697759987576RECORDX,REC_NOT_GAPGRANTED5

范围 2:

begin ;
select * from t5 where c > 5 and c <=10 for update ;

-- sesssion 2:
insert into t5 value (2, 2,2); -- 正常执行
insert into t5 value (7, 7,7); -- 阻塞
insert into t5 value (11, 11,11); -- 阻塞
UPDATE t5 SET d = d + 1 WHERE c = 5; -- 正常执行
UPDATE t5 SET d = d + 1 WHERE c = 10; -- 阻塞
UPDATE t5 SET d = d + 1 WHERE c = 15; -- 阻塞
UPDATE t5 SET d = d + 1 WHERE id = 15; -- 正常执行
ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140697851112664:1085:1406977599840483310257192demot5nullnullnull140697759984048TABLEIXGRANTEDnull
INNODB140697851112664:20:5:5:1406977599810563310257192demot5nullnullc140697759981056RECORDXWAITING15, 15
INNODB140697851113472:1085:1406977599901443308758137demot5nullnullnull140697759990144TABLEIXGRANTEDnull
INNODB140697851113472:20:5:4:1406977599872323308758137demot5nullnullc140697759987232RECORDXGRANTED10, 10
INNODB140697851113472:20:5:5:1406977599872323308758137demot5nullnullc140697759987232RECORDXGRANTED15, 15
INNODB140697851113472:20:4:4:1406977599875763308758137demot5nullnullPRIMARY140697759987576RECORDX,REC_NOT_GAPGRANTED10

范围 3:

begin ;
select * from t5 where c <= 10 for update ;

锁分析

ENGINEENGINE_LOCK_IDENGINE_TRANSACTION_IDTHREAD_IDEVENT_IDOBJECT_SCHEMAOBJECT_NAMEPARTITION_NAMESUBPARTITION_NAMEINDEX_NAMEOBJECT_INSTANCE_BEGINLOCK_TYPELOCK_MODELOCK_STATUSLOCK_DATA
INNODB140697851113472:1085:1406977599901443310858263demot5nullnullnull140697759990144TABLEIXGRANTEDnull
INNODB140697851113472:20:5:2:1406977599872323310858263demot5nullnullc140697759987232RECORDXGRANTED0, 0
INNODB140697851113472:20:5:3:1406977599872323310858263demot5nullnullc140697759987232RECORDXGRANTED5, 5
INNODB140697851113472:20:5:4:1406977599872323310858263demot5nullnullc140697759987232RECORDXGRANTED10, 10
INNODB140697851113472:20:5:5:1406977599872323310858263demot5nullnullc140697759987232RECORDXGRANTED15, 15
INNODB140697851113472:20:4:2:1406977599875763310858263demot5nullnullPRIMARY140697759987576RECORDX,REC_NOT_GAPGRANTED0
INNODB140697851113472:20:4:3:1406977599875763310858263demot5nullnullPRIMARY140697759987576RECORDX,REC_NOT_GAPGRANTED5
INNODB140697851113472:20:4:4:1406977599875763310858263demot5nullnullPRIMARY140697759987576RECORDX,REC_NOT_GAPGRANTED10

【5】performance_schema.data_locks 表

表级锁 (LOCK_TYPE = ‘TABLE’)

锁类型LOCK_MODE 显示值说明
表共享读锁S允许其他会话读但禁止写
表排他写锁X禁止其他会话任何操作
意向共享锁IS表示事务打算在表的某些行上设置共享锁
意向排他锁IX表示事务打算在表的某些行上设置排他锁

行级锁 (LOCK_TYPE = ‘RECORD’)

基本行锁类型

锁类型LOCK_MODE 显示值锁定范围兼容性
记录锁 (X锁)X,REC_NOT_GAP仅锁定单条记录与其他所有锁互斥
记录锁 (S锁)S,REC_NOT_GAP仅锁定单条记录允许多个S锁,与X锁互斥
间隙锁X,GAP
S,GAP
锁定记录之间的间隙允许多个事务持有相同间隙锁
临键锁X
S
锁定记录+前间隙 (左开右闭)X锁与其他所有锁互斥
插入意向锁X,INSERT_INTENTION插入操作特有的间隙锁允许多个不冲突的插入意向锁

特殊行锁类型

锁类型LOCK_MODE 显示值说明
谓词锁X,PURGED用于空间索引的谓词锁 (MySQL 8.0.17+)
超级锁X,SUPER系统内部使用的特殊锁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值