Mysql 死锁过程及案例详解之用户自定义锁
Mysql 用户自定义锁介绍
锁简介
当多个请求连接到数据库时,能保证同类查询执行时不相互冲突的机制即是锁。比如马路上的信号灯就是一个解决冲突的例子,在一定的时间内锁定了能通行的方向或者路线。MySQL里的锁实际上是一个处于处于授予或挂起状态锁请求。
锁的访问级别
锁的访问级别(Lock Access Levels)即定义锁以那种方式进入(使用)。主要有两种方式:共享的(shared)和排他的(exclusive)。
共享锁是比较宽松的锁,即允许多个连接访问。而排他锁则只能指定一个连接访问的锁。有时我们又称共享锁为读锁,排他锁为写锁。
锁的粒度
Mysql通过各种锁的粒度(类型)去控制数据的访问,这样可以尽可能的进行数据的并发访问。
用户自定义锁User-Level Locks
用户自定义锁是一种显式的锁,即用户通过数据库内置的函数生成锁。这些锁都是排他锁且可以指定的锁名最多64个字符。
函数名 |
功能 |
参数 |
额外说明 |
GET_LOCK |
按照指定的名称、等待时间获得(生成)锁。 |
1 name 锁名 2 timeout 锁等待时间 |
1 timeout为正数时,如果在指定timeout连接上锁则返回1,否则返回0。 2 timeout为负数时会一直等待锁。 |
IS_FREE_LOCK |
检查指定的锁是否可用 |
name 名字 |
可用返回1否则为0 |
IS_USED_LOCK |
检查指定的锁是否已用 |
name 名字 |
如果锁可用时返回连接ID(connection id),不可用时返回NULL。 |
RELEASE_ALL_LOCKS |
释放用户锁 |
返回锁的数量。 |
|
RELEASE_LOCK |
释放指定的用户锁 |
name锁名 |
1 锁存在:释放成功返回1,否则为0(锁存在但不属于该连接时)。 2 锁不存在:返回null。 |
示意案例1
Step1:在第一个会话(session1)里执行:
SELECT GET_LOCK('lock_1',10);
/*此时返回为:
1
-- 即可以生成锁lock_1。
*/
Step2:此时在会话1里我们查看下锁的状态:
SELECT IS_USED_LOCK('lock_1') AS ISUsedLock,
IS_FREE_LOCK('lock_1') AS ISFreeLock
/*返回结果
ISUsedLock ISFreeLock
10 0
*/
Step3:而在另外个会话(session2)里执行:
SELECT GET_LOCK('lock_1',10);
即会话2里经过了10秒的尝试并不能获得锁lock_1。
Step4:如果在会话1里释放锁lock_1,那么会话2可以获得锁lock_1。
-- 会话1里释放锁lock_1。
SELECT RELEASE_LOCK('lock_1')
/*返回结果
RELEASE_LOCK('lock_1')
1
*/
-- 会话2里获得锁lock_1。
SELECT GET_LOCK('lock_1',10);
/*返回结果
GET_LOCK('lock_1',10)
1
*/
注:用户自定义锁是应用程序级别的锁,拿到锁的应用程序有排他性,并不针对特定的表和字段。
2 如果timeout设置为-1,那么在如上的实验中会话2会一直等待,直至会话1释放锁。
示意案例2
-- Step1:在第一个会话(session1)里执行:
SELECT GET_LOCK('lock_1',-1);-- Step2:在第二个会话(session2)里执行:
SELECT GET_LOCK('lock_2',-1);-- Step3:在第二个会话(session2)里执行:
SELECT GET_LOCK('lock_1',-1);-- Step4:在第一个会话(session1)里执行:
SELECT GET_LOCK('lock_2',-1);
解释:这里我们可以看到在会话1、会话2里分别生成锁lock_1、lock_2。接下来会话2去获取lock_1,这里是无限等待(timeout为-1)。然后在会话1又获取锁lock_2,此时就发生了死锁,因为会话2的连接当前还在尝试获取锁lock_1,无法释放lock_2,此时会话1访问锁lock_2就发生死锁。当一个连接处理多个锁时会出现死锁的情况。
后续处理:分别在会话1、会话2里执行释放锁语句或者关闭连接自动释放锁。
这好比食堂里有两个人A、B都在用勺子1、2一个汤池里盛汤,但B在拿着勺2的情况下去等勺1,而A也想用B手里的勺2。这样显然会出现“冲突”,即如果双方都不谦让岂不是一直僵直在哪里了?!这就是死锁。
而对于其他分别在A、B后面排队的人,他们可能不知道A、B的状态,他们会一直等待A、B释放手中的勺子。
SELECT RELEASE_ALL_LOCKS()
自定义锁详情
通过数据字典查看用户自定义锁详情:
mysql> SELECT *-> FROM performance_schema.metadata_locks-> WHERE OBJECT_TYPE = 'USER LEVEL LOCK' \G
*************************** 1. row ***************************OBJECT_TYPE: USER LEVEL LOCKOBJECT_SCHEMA: NULLOBJECT_NAME: my_lock_1COLUMN_NAME: NULL
OBJECT_INSTANCE_BEGIN: 140483603134144LOCK_TYPE: EXCLUSIVELOCK_DURATION: EXPLICITLOCK_STATUS: GRANTEDSOURCE: item_func.cc:5452OWNER_THREAD_ID: 49OWNER_EVENT_ID: 139
*************************** 2. row ***************************OBJECT_TYPE: USER LEVEL LOCKOBJECT_SCHEMA: NULLOBJECT_NAME: my_lock_2COLUMN_NAME: NULL
OBJECT_INSTANCE_BEGIN: 93976377610320LOCK_TYPE: EXCLUSIVELOCK_DURATION: EXPLICITLOCK_STATUS: GRANTEDSOURCE: item_func.cc:5452OWNER_THREAD_ID: 50OWNER_EVENT_ID: 62
*************************** 3. row ***************************OBJECT_TYPE: USER LEVEL LOCKOBJECT_SCHEMA: NULLOBJECT_NAME: my_lock_1COLUMN_NAME: NULL
OBJECT_INSTANCE_BEGIN: 93976377962800LOCK_TYPE: EXCLUSIVELOCK_DURATION: EXPLICITLOCK_STATUS: PENDINGSOURCE: item_func.cc:5452OWNER_THREAD_ID: 50OWNER_EVENT_ID: 69
3 rows in set (0.00 sec)
Mysql 死锁过程及案例详解之用户自定义锁相关推荐
- Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock
记录锁Record Lock与间隔锁GAP Lock 记录锁Record Lock 记录锁Record Locks又称为行锁,它同时包含索引和间隔锁.记录锁可以是共享锁也可能是排他锁.可以通过perf ...
- Mysql 死锁过程及案例详解之元数据锁MetaData Lock
Mysql数据锁MetaData Lock 元数据锁MetaData Lock 元数据锁MetaData Locks的主要作用是在执行查询或者发起事务时元数据结构受到保护,即不被修改. MetaDat ...
- Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock
Mysql 插入意向锁与自增锁备份锁日志锁 插入意向锁Insert Intention Lock 插入意向锁Insert intention locks是记录级别的,它通过"INSERT&q ...
- Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock
显式锁Explicit Table Lock与隐式锁Explicit Table Lock 显式锁Explicit Table Lock 显式表锁(Explicit Table Locks)即通过命令 ...
- Mysql 死锁过程及案例详解之清空缓存锁Flush Lock
Mysql 清空缓存锁Flush Lock 清空缓存锁Flush Locks flush table的功能是关闭所有打开的表,强制关闭所有正在使用的表,并刷新准备好的语句缓存. 这种操作需要用户拥有 ...
- MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等
一. 简介 1. 锁定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...
- 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 ...
最新文章
- libcurl断点下载遇到的问题
- 70佳精美的PSD素材免费下载(上篇)
- Fidder监控请求响应时间(毫秒)和请求IP
- 为什么打印还要另存为_锦学考研 | 打印准考证的常犯错误
- NET主流ORM框架分析
- 【渝粤教育】电大中专职业应用写作作业 题库
- 【OS学习笔记】二十三 保护模式七:保护模式下任务的隔离与任务的特权级概念
- Android Bluetooth BLE相关开发资源汇总
- 微服务等于Spring Cloud?一文告诉你微服务到底是什么
- 每天都在和Maven打交道?你真的了解它吗?
- 将vue,H5项目打包成app,apk安装包
- JSON-RPC是什么东西
- VUE根据后端返回url链接下载文件
- 七夕节送女朋友什么礼物、能让女生感动到哭的礼物推荐
- 区块链教程Fabric1.0源代码分析Ledger(账本)二
- 欧拉计划22--Names score
- HTTP的几种请求方法
- 用动画和实战打开 React Hooks(一):useState 和 useEffect
- 安全架构--11--企业数据安全体系建设总结
- 蓝桥杯 算法提高VIP 计算器(java)
热门文章
- VTK:通过法线显示颜色用法实战
- OpenCASCADE:Modeling Data之几何实用程序
- wxWidgets:显示和测试 wxDC 功能
- wxWidgets:编写非英语应用程序
- wxWidgets:Sizer 概览
- boost::serial_executor_cont相关的测试程序
- boost::fusion::zip用法的测试程序
- Boost:align overflow对齐溢出的测试程序
- ITK:从测量列表创建直方图
- ITK:过滤图像FilterImage