首批通过分布式安全可靠测评,为关键业务系统打造
GET_LOCK
更新时间:2026-04-10 11:58:01
描述
该函数用于尝试获取一个带有特定名称(str)的锁。当一个会话成功地获取了一个特定名称的锁之后,其他任何会话在尝试获取同名的锁时都会被阻塞(即被迫等待),直到原来持有该锁的会话释放该锁为止。
使用 GET_LOCK() 函数获取的锁可以通过执行 RELEASE_LOCK() 来显式释放,除此之外,当会话终止时,无论是正常结束还是异常结束,该会话持有的锁都会被隐式释放。
注意
使用 GET_LOCK() 获得的锁不会因事务的提交或回滚而被释放。
语法
GET_LOCK('str', timeout)
说明
参数解释
str: 指定锁的名称,字符串类型。timeout: 指定等待锁释放的超时时间(以秒为单位)。取值如下:- 取值可以是一个 0 或者正数。
- 也可以是负值,则表示等待时间是无限的,即会话将一直等待直至获取到锁。
返回值
- 返回 1:表示锁已成功获取。此时调用
GET_LOCK的那个会话拥有了锁,其他任何尝试获取同名锁的操作都将不会成功,除非这个锁被释放。 - 返回 0:表示获取锁的尝试由于超时而失败。这通常意味着锁已经被另一个会话获取并且在超时期间没有被释放。
- 返回
NULL:表示尝试获取锁时发生错误,这可能是由于内存不足,或者尝试获取锁的线程被强制结束。
示例
在会话 1 中执行下面命令,尝试获取名为
my_lock的锁,最多等待 10 秒。obclient [(none)]> SELECT GET_LOCK('my_lock', 10);返回结果如下:
+-------------------------+ | GET_LOCK('my_lock', 10) | +-------------------------+ | 1 | +-------------------------+ 1 row in set返回结果为 1,表示锁
my_lock已成功获取。在会话 2 中执行下面命令,尝试获取名为
my_lock的锁,最多等待 10 秒。obclient [(none)]> SELECT GET_LOCK('my_lock', 10);返回结果如下:
+-------------------------+ | GET_LOCK('my_lock', 10) | +-------------------------+ | 0 | +-------------------------+ 1 row in set返回结果为 0,表示获取锁
my_lock的尝试由于超时而失败。