Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock相关的知识,希望对你有一定的参考价值。
显式锁Explicit Table Lock与隐式锁Explicit Table Lock
显式锁Explicit Table Lock
显式表锁(Explicit Table Locks)即通过命令lock tables对表进行锁定(共享或排他锁)、FLUSH TABLES WITH READ LOCK(共享锁),直到用显式的命令UNLOCK TABLES语句才能解锁。当FLUSH TABLES WITH READ LOCK不接表名时会触发metadata lock。
示意案例
-- 锁定emp表只能读、写
LOCK TABLES emp READ,
dept WRITE;
-- 在该会话里执行更新操作
UPDATE ShenLiang2025.emp
SET sal=1800.00
WHERE empno=7369
> 1099 - Table 'emp' was locked with a READ lock and can't be updated
> 时间: 0s
-- 在该会话里对dept执行更新操作
UPDATE dept SET loc='NEW YORK3' WHERE deptno=10
> Affected rows: 1
> 时间: 0.01s
-- 在该会话里对dept执行查询操作时会进入持续等待。
--通过执行unlock tables释放表的锁定。
UNLOCK TABLES
-- 没有被锁定的表执行查询时报错。
SELECT * FROM salgrade
> 1100 - Table 'salgrade' was not locked with LOCK TABLES
> 时间: 0s
隐式锁Implicit Table Lock
隐式锁(Implicit Table Locks), InnoDB在表级用到意向锁。常见的语句如:
意向共享锁:SELECT ... FOR SHARE 跟SELECT ... LOCK IN SHARE MODE效果一样。
意向排他锁:SELECT ... FOR UPDATE或者其它的DML语句(这里不含SELECT),如果涉及到外键里引用的表也会被锁定。
关于两个意向锁的兼容性可见下表
Exclusive (X) | Intention Exclusive (IX) | Shared (S) | Intention Shared (IS) | |
Exclusive (X) | ✘ | ✘ | ✘ | ✘ |
Intention Exclusive (IX) | ✘ | ✔ | ✘ | ✔ |
Shared (S) | ✘ | ✘ | ✔ | ✔ |
Intention Shared (IS) | ✘ | ✔ | ✔ | ✔ |
注:
1 这里Shared (S)是共享锁,Exclusive (X)是排他锁,Intention Exclusive (IX)是意向排他锁,Intention Shared (IS)是意向共享锁。
示意案例
--Step1 执行未完成事务(更新数据)
START TRANSACTION
> OK
> 时间: 0s
#SELECT * FROM emp WHERE empno=7499
UPDATE emp SET sal=11600.00 WHERE empno=7499
> Affected rows: 1
> 时间: 0s
--Step2 查看当前锁的详细信息
mysql> SELECT * FROM performance_schema.data_locks WHERE LOCK_TYPE = 'TABLE' \\G
*************************** 1. row ***************************
ENGINE: INNODB
ENGINE_LOCK_ID: 139740117241048:1111:139740049386240
ENGINE_TRANSACTION_ID: 38166
THREAD_ID: 48
EVENT_ID: 56
OBJECT_SCHEMA: ShenLiang2025
OBJECT_NAME: emp
PARTITION_NAME: NULL
SUBPARTITION_NAME: NULL
INDEX_NAME: NULL
OBJECT_INSTANCE_BEGIN: 139740049386240
LOCK_TYPE: TABLE
LOCK_MODE: IX
LOCK_STATUS: GRANTED
LOCK_DATA: NULL
1 row in set (0.02 sec)
通过结果可以看出当前是IX锁。
-- Step3 最后通过rollback回滚该事务。
ROLLBACK;
以上是关于Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock的主要内容,如果未能解决你的问题,请参考以下文章