函数 |
说明 |
GET_LOCK() |
获取命名锁 |
IS_FREE_LOCK() |
命名锁是否空闲 |
IS_USED_LOCK() |
命名锁是否正在使用中;如果为 true,则返回连接标识符 |
RELEASE_ALL_LOCKS() |
释放所有当前命名锁 |
RELEASE_LOCK() |
释放命名锁 |
GET_LOCK(str,timeout)
- 尝试使用由字符串 str 给出的名称获取锁,使用 timeout 秒的超时。负超时值意味着无限超时。锁是独占的。当一个会话持有时,其他会话不能获得同名的锁。
- 如果锁定成功返回 1,如果尝试超时返回 0(例如,因为另一个客户端之前锁定了该名称),或者如果发生错误(例如内存不足或线程被 mysqladmin kill 杀死)则返回 NULL )。
- 使用 GET_LOCK() 获得的锁通过执行 RELEASE_LOCK() 或在会话终止(正常或异常)时隐式释放。事务提交或回滚时,不会释放使用 GET_LOCK() 获得的锁。
- GET_LOCK() 是使用元数据锁定 (MDL) 子系统实现的。可以同时获取多个锁,并且 GET_LOCK() 不会释放任何现有锁。例如,假设您执行以下语句:
示例
SELECT GET_LOCK('lock1',10);
SELECT GET_LOCK('lock2',10);
SELECT RELEASE_LOCK('lock2');
SELECT RELEASE_LOCK('lock1'
- 第二个 GET_LOCK() 获取第二个锁,两个 RELEASE_LOCK() 调用都返回 1(成功)。
- 一个给定的会话甚至可以为同一个名字获取多个锁。在获取会话释放其对该名称的所有锁之前,其他会话无法获取具有该名称的锁。
- 使用 GET_LOCK() 获取的唯一命名锁出现在 Performance Schema metadata_locks 表中。 OBJECT_TYPE 列表示 USER LEVEL LOCK,OBJECT_NAME 列表示锁名称。
在为同一个名称获取多个锁的情况下,只有该名称的第一个锁在 metadata_locks 表中注册一行。名称的后续锁会增加锁中的计数器,但不会获取额外的元数据锁。当名称上的最后一个锁实例被释放时,锁的 metadata_locks 行将被删除。
- 获取多个锁的能力意味着客户端之间存在死锁的可能性。发生这种情况时,服务器会选择一个调用者并以 ER_USER_LOCK_DEADLOCK 错误终止其锁定获取请求。此错误不会导致事务回滚。
- GET_LOCK() 可用于实现应用程序锁或模拟记录锁。名称在服务器范围内被锁定。如果一个名称已在一个会话中锁定,则 GET_LOCK() 会阻止另一个会话对同名锁的任何请求。这使同意给定锁名称的客户端能够使用该名称来执行协作咨询锁定。但请注意,它还会使不在合作客户端集合中的客户端无意或故意锁定名称,从而防止任何合作客户端锁定该名称。降低这种可能性的一种方法是使用特定于数据库或特定于应用程序的锁名称。例如,使用 db_name.str 或 app_name.str 形式的锁名称。
- 如果多个客户端正在等待一个锁,它们获取锁的顺序是不确定的。应用程序不应假定客户端获取锁的顺序与它们发出锁请求的顺序相同。
- 不同的锁定接口可以作为插件服务或一组可加载函数提供。与GET_lock()和相关函数提供的接口不同,该接口提供锁名称空间和不同的读写锁
注
- MySQL 强制锁定名称的最大长度为 64 个字符。
- GET_LOCK() 对于基于语句的复制是不安全的。如果在 binlog_format 设置为 STATEMENT 时使用此函数,则会记录警告。
- 由于 GET_LOCK() 仅在单个 mysqld 上建立锁,因此不适合与 NDB Cluster 一起使用,后者无法跨多个 MySQL 服务器强制执行 SQL 锁。
IS_FREE_LOCK(str)
- 检查名为 str 的锁是否可以自由使用(即未锁定)。如果锁是空闲的(没有人在使用锁),则返回 1,如果锁正在使用中,则返回 0,如果发生错误(例如参数不正确),则返回 NULL。
- 此函数对于基于语句的复制是不安全的。如果在 binlog_format 设置为 STATEMENT 时使用此函数,则会记录警告。
IS_USED_LOCK(str)
- 检查名为 str 的锁是否正在使用(即锁定)。如果是,则返回持有锁的客户端会话的连接标识符。否则,它返回 NULL。
- 此函数对于基于语句的复制是不安全的。如果在 binlog_format 设置为 STATEMENT 时使用此函数,则会记录警告。
RELEASE_ALL_LOCKS()
- 释放当前会话持有的所有命名锁,并返回释放的锁数(如果没有,则为 0)
- 此函数对于基于语句的复制是不安全的。如果在 binlog_format 设置为 STATEMENT 时使用此函数,则会记录警告。
RELEASE_LOCK(str)
- 释放由 GET_LOCK() 获得的字符串 str 命名的锁。如果锁被释放,则返回 1,如果该线程没有建立锁(在这种情况下,锁不会被释放),则返回 0,如果指定的锁不存在,则返回 NULL。如果从未通过调用 GET_LOCK() 获得该锁,或者如果它之前已被释放,则该锁不存在。
- DO 语句与 RELEASE_LOCK() 一起使用很方便
- 此函数对于基于语句的复制是不安全的。如果在 binlog_format 设置为 STATEMENT 时使用此函数,则会记录警告。
来自 <https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html>