跳到主要内容
版本:V1.0.0

GET_LOCK

描述

该函数用于尝试获取一个带有特定名称(str)的锁。当一个会话成功地获取了一个特定名称的锁之后,其他任何会话在尝试获取同名的锁时都会被阻塞(即被迫等待),直到原来持有该锁的会话释放该锁为止。

使用 GET_LOCK() 函数获取的锁可以通过执行 RELEASE_LOCK() 来显式释放,除此之外,当会话终止时,无论是正常结束还是异常结束,该会话持有的锁都会被隐式释放。

提示

使用 GET_LOCK() 获得的锁不会因事务的提交或回滚而被释放。

语法

GET_LOCK('str', timeout)

说明

参数解释

  • str: 指定锁的名称,字符串类型。

  • timeout: 指定等待锁释放的超时时间(以秒为单位)。取值如下:

    • 取值可以是一个 0 或者正数。
    • 也可以是负值,则表示等待时间是无限的,即会话将一直等待直至获取到锁。

返回值

  • 返回 1:表示锁已成功获取。此时调用 GET_LOCK 的那个会话拥有了锁,其他任何尝试获取同名锁的操作都将不会成功,除非这个锁被释放。
  • 返回 0:表示获取锁的尝试由于超时而失败。这通常意味着锁已经被另一个会话获取并且在超时期间没有被释放。
  • 返回 NULL:表示尝试获取锁时发生错误,这可能是由于内存不足,或者尝试获取锁的线程被强制结束。

示例

  1. 在会话 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. 在会话 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 的尝试由于超时而失败。

相关文档

RELEASE_LOCK