扩展 MySQL 8.0  / 第 6 章 向 MySQL 添加函数  /  12.15 锁定函数

12.15 锁定函数

本节描述用于操作用户级锁的函数。

表 12.19 锁定功能

姓名 描述
GET_LOCK() 获取命名锁
IS_FREE_LOCK() 命名锁是否空闲
IS_USED_LOCK() 命名锁是否正在使用;如果为真,则返回连接标识符
RELEASE_LOCK() 释放命名锁

  • GET_LOCK(str,timeout)

    尝试使用 string 给定的名称获取锁 str,使用超时 timeout秒数。负值 timeout意味着无限超时。锁是独占的。当由一个会话持有时,其他会话无法获得同名锁。

    1如果成功获得锁,0如果尝试超时(例如,因为另一个客户端先前已锁定该名称),或者NULL是否发生错误(例如内存不足或线程被 mysqladmin kill 杀死), 则 返回。

    当您的会话终止(正常或异常)时GET_LOCK() ,通过执行或隐式释放 获得的锁。 当事务提交或回滚时,不会释放使用 RELEASE_LOCK()获得的锁。GET_LOCK()

    重要的

    GET_LOCK() MySQL 5.7 中更改的行为。考虑到以后的升级,限制在str64个字符以内,不要依赖后续调用 GET_LOCK()释放之前的锁。

    GET_LOCK()可用于实现应用程序锁或模拟记录锁。名称在服务器范围内被锁定。如果一个名称在一个会话中被锁定,GET_LOCK() 阻止另一个会话对同名锁的任何请求。这使同意给定锁名称的客户端能够使用该名称来执行协作咨询锁定。但请注意,它还可以使不在合作客户端集合中的客户端无意或有意地锁定名称,从而防止任何合作客户端锁定该名称。减少这种可能性的一种方法是使用特定于数据库或特定于应用程序的锁名称。例如,使用 db_name.str或 形式的锁名称app_name.str

    mysql> SELECT GET_LOCK('lock1',10);
            -> 1
    mysql> SELECT IS_FREE_LOCK('lock2');
            -> 1
    mysql> SELECT GET_LOCK('lock2',10);
            -> 1
    mysql> SELECT RELEASE_LOCK('lock2');
            -> 1
    mysql> SELECT RELEASE_LOCK('lock1');
            -> NULL

    第二次RELEASE_LOCK()调用返回,因为第二次调用自动释放NULL了锁 。 'lock1'GET_LOCK()

    如果多个客户端正在等待一个锁,则它们获取锁的顺序是不确定的。应用程序不应假设客户端获取锁的顺序与它们发出锁请求的顺序相同。

    GET_LOCK()对于基于语句的复制是不安全的。如果您在 binlog_format设置为 时使用此功能,则会记录一条警告STATEMENT

    由于GET_LOCK()仅在单个mysqld上建立锁,因此它不适合与 NDB Cluster 一起使用,NDB Cluster 无法在多个 MySQL 服务器上强制执行 SQL 锁。有关更多信息,请参阅 第 18.2.7.10 节,“与多个 NDB Cluster 节点相关的限制”

  • IS_FREE_LOCK(str)

    检查命名的锁是否str 可以免费使用(即未锁定)。返回 1锁是否空闲(没有人在使用锁)、0锁是否正在使用以及 NULL是否发生错误(例如不正确的参数)。

    此函数对于基于语句的复制是不安全的。如果您在 binlog_format设置为 时使用此功能,则会记录一条警告STATEMENT

  • IS_USED_LOCK(str)

    检查指定的锁是否str 正在使用(即锁定)。如果是,它返回持有锁的客户端会话的连接标识符。否则,它返回NULL

    此函数对于基于语句的复制是不安全的。如果您在 binlog_format设置为 时使用此功能,则会记录一条警告STATEMENT

  • RELEASE_LOCK(str)

    str释放以获得 的字符串命名的锁 GET_LOCK()。返回 1锁是否被释放, 0如果锁不是由这个线程建立的(在这种情况下锁没有被释放), NULL如果命名的锁不存在。GET_LOCK()如果锁从未通过调用获得或之前已被释放,则 锁不存在 。

    DO语句与 一起使用很方便RELEASE_LOCK()。请参阅 第 13.2.3 节,“DO 语句”

    此函数对于基于语句的复制是不安全的。如果您在 binlog_format设置为 时使用此功能,则会记录一条警告STATEMENT