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=7499UPDATE 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: INNODBENGINE_LOCK_ID: 139740117241048:1111:139740049386240ENGINE_TRANSACTION_ID: 38166THREAD_ID: 48EVENT_ID: 56OBJECT_SCHEMA: ShenLiang2025OBJECT_NAME: empPARTITION_NAME: NULLSUBPARTITION_NAME: NULLINDEX_NAME: NULLOBJECT_INSTANCE_BEGIN: 139740049386240LOCK_TYPE: TABLELOCK_MODE: IXLOCK_STATUS: GRANTEDLOCK_DATA: NULL1 row in set (0.02 sec)通过结果可以看出当前是IX锁。-- Step3 最后通过rollback回滚该事务。ROLLBACK;
Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock相关推荐
- Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock
Mysql 插入意向锁与自增锁备份锁日志锁 插入意向锁Insert Intention Lock 插入意向锁Insert intention locks是记录级别的,它通过"INSERT&q ...
- Mysql 死锁过程及案例详解之用户自定义锁
Mysql 用户自定义锁介绍 锁简介 当多个请求连接到数据库时,能保证同类查询执行时不相互冲突的机制即是锁.比如马路上的信号灯就是一个解决冲突的例子,在一定的时间内锁定了能通行的方向或者路线.MySQ ...
- Mysql 死锁过程及案例详解之元数据锁MetaData Lock
Mysql数据锁MetaData Lock 元数据锁MetaData Lock 元数据锁MetaData Locks的主要作用是在执行查询或者发起事务时元数据结构受到保护,即不被修改. MetaDat ...
- Mysql 死锁过程及案例详解之清空缓存锁Flush Lock
Mysql 清空缓存锁Flush Lock 清空缓存锁Flush Locks flush table的功能是关闭所有打开的表,强制关闭所有正在使用的表,并刷新准备好的语句缓存. 这种操作需要用户拥有 ...
- Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock
记录锁Record Lock与间隔锁GAP Lock 记录锁Record Lock 记录锁Record Locks又称为行锁,它同时包含索引和间隔锁.记录锁可以是共享锁也可能是排他锁.可以通过perf ...
- wow mysql dbc_DBC中悲观锁介绍附案例详解
DBC中悲观锁介绍附案例详解 了解下DBC中悲观锁: 代码如下: BDUtils 工具类: package JDBC; import java.sql.*; public class BDUtils ...
- mysql 自动截断_MySql中关于超长自动截断的案例详解
这篇文章主要介绍了MySql超长自动截断实例详解的相关资料,这里通过实例来说明如何实现自动截断的功能,需要的朋友可以参考下 MySql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者 ...
- 数据湖架构Hudi(五)Hudi集成Flink案例详解
五.Hudi集成Flink案例详解 5.1 hudi集成flink flink的下载地址: https://archive.apache.org/dist/flink/ Hudi Supported ...
- 代码检查规则:Python语言案例详解
在之前的文章中代码检查规则:Java语言案例详解学习了Java的检查规则.我们今天将学习<代码检查规则:Python语言案例详解>,内容主要分为两个部分:Python的代码检查规则和Pyt ...
最新文章
- 神器来啦!一键可视化,终于能看懂神经网络到底在干啥了
- 富士康c语言试卷答案,2015富士康笔试题目及答案
- 十天精通CSS3(11)
- java js 执行效率_JavaScript提高加载和执行效率的方法
- vsftp+tftp+dhcp+pxe+kickstart自动化安装操作系统
- 第三篇:稳定性之借风险之力驱动架构演进
- 由pthread_create引起的段错误
- python动态页面元素爬取_python动态爬取网页
- 有关两个jar包中包含完全相同的包名和类名的加载问题
- 火狐浏览器缓存区的利用,如何提取火狐缓存的动画
- [Python设计模式] 第14章 老板来了——观察者模式
- 解决wordpress用户注册时,点击邮件中的重置密码链接提示“您的密码重设链接无效”
- IP库GeoLite2-City.mmdb的使用
- 重庆人文科技学院计算机学院院长,我校计算机工程学院成立大会圆满闭幕
- NetLink机制使用
- 3D影视建模:你这个糟老头子坏的很,来看看《糟老头子》制作流程分享
- 基于JSP的物流信息管理系统(MySQL版)
- 大数据正在改变我们的生活
- 剑指offer:顺时针打印矩阵(Python)
- Java常用类(六):FilenameUtils类
热门文章
- VTK:多行文本用法实战
- VTK:参数化超椭球用法实战
- OpenCASCADE绘制测试线束:布尔运算命令之设置选项的操作
- wxWidgets:wxPlatformInfo类用法
- boost::ptr_container::indirect_fun相关的测试程序
- boost::mp11::integer_sequence相关用法的测试程序
- boost::intrusive::bucket_traits用法的测试程序
- boost::hana::test::TestGroup用法的测试程序
- boost::hana::greater用法的测试程序
- boost::hana::curry用法的测试程序