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的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C self->_ivar 访问与显式与隐式 self->

并发编程之显式锁原理

事务隔离实现并发控制:MySQL系列之十

MySQL完全笔记数据库锁篇

Mysql 死锁过程及案例详解之用户自定义锁

Mysql 死锁过程及案例详解之用户自定义锁