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 死锁过程及案例详解之用户自定义锁相关推荐

  1. Mysql 死锁过程及案例详解之记录锁与间隔锁Record Lock Gap Lock

    记录锁Record Lock与间隔锁GAP Lock 记录锁Record Lock 记录锁Record Locks又称为行锁,它同时包含索引和间隔锁.记录锁可以是共享锁也可能是排他锁.可以通过perf ...

  2. Mysql 死锁过程及案例详解之元数据锁MetaData Lock

    Mysql数据锁MetaData Lock 元数据锁MetaData Lock 元数据锁MetaData Locks的主要作用是在执行查询或者发起事务时元数据结构受到保护,即不被修改. MetaDat ...

  3. Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock

    Mysql 插入意向锁与自增锁备份锁日志锁 插入意向锁Insert Intention Lock 插入意向锁Insert intention locks是记录级别的,它通过"INSERT&q ...

  4. Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock

    显式锁Explicit Table Lock与隐式锁Explicit Table Lock 显式锁Explicit Table Lock 显式表锁(Explicit Table Locks)即通过命令 ...

  5. Mysql 死锁过程及案例详解之清空缓存锁Flush Lock

    Mysql 清空缓存锁Flush Lock 清空缓存锁Flush Locks flush table的功能是关闭所有打开的表,强制关闭所有正在使用的表,并刷新准备好的语句缓存. 这种操作需要用户拥有  ...

  6. MySQL锁、事务隔离级别、MVCC机制详解、间隙锁、死锁等

    一. 简介 1. 锁定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供需要用户共享的资源.如何保证数据并 ...

  7. wow mysql dbc_DBC中悲观锁介绍附案例详解

    DBC中悲观锁介绍附案例详解 了解下DBC中悲观锁: 代码如下: BDUtils 工具类: package JDBC; import java.sql.*; public class BDUtils ...

  8. mysql 自动截断_MySql中关于超长自动截断的案例详解

    这篇文章主要介绍了MySql超长自动截断实例详解的相关资料,这里通过实例来说明如何实现自动截断的功能,需要的朋友可以参考下 MySql超长自动截断实例详解 小伙伴问到一个问题,为啥在项目中调用插入或者 ...

  9. 数据湖架构Hudi(五)Hudi集成Flink案例详解

    五.Hudi集成Flink案例详解 5.1 hudi集成flink flink的下载地址: https://archive.apache.org/dist/flink/ Hudi Supported ...

最新文章

  1. libcurl断点下载遇到的问题
  2. 70佳精美的PSD素材免费下载(上篇)
  3. Fidder监控请求响应时间(毫秒)和请求IP
  4. 为什么打印还要另存为_锦学考研 | 打印准考证的常犯错误
  5. NET主流ORM框架分析
  6. 【渝粤教育】电大中专职业应用写作作业 题库
  7. 【OS学习笔记】二十三 保护模式七:保护模式下任务的隔离与任务的特权级概念
  8. Android Bluetooth BLE相关开发资源汇总
  9. 微服务等于Spring Cloud?一文告诉你微服务到底是什么
  10. 每天都在和Maven打交道?你真的了解它吗?
  11. 将vue,H5项目打包成app,apk安装包
  12. JSON-RPC是什么东西
  13. VUE根据后端返回url链接下载文件
  14. 七夕节送女朋友什么礼物、能让女生感动到哭的礼物推荐
  15. 区块链教程Fabric1.0源代码分析Ledger(账本)二
  16. 欧拉计划22--Names score
  17. HTTP的几种请求方法
  18. 用动画和实战打开 React Hooks(一):useState 和 useEffect
  19. 安全架构--11--企业数据安全体系建设总结
  20. 蓝桥杯 算法提高VIP 计算器(java)

热门文章

  1. VTK:通过法线显示颜色用法实战
  2. OpenCASCADE:Modeling Data之几何实用程序
  3. wxWidgets:显示和测试 wxDC 功能
  4. wxWidgets:编写非英语应用程序
  5. wxWidgets:Sizer 概览
  6. boost::serial_executor_cont相关的测试程序
  7. boost::fusion::zip用法的测试程序
  8. Boost:align overflow对齐溢出的测试程序
  9. ITK:从测量列表创建直方图
  10. ITK:过滤图像FilterImage