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