本节描述用于操作用户级锁的函数。
表 12.19 锁定功能
姓名 | 描述 |
---|---|
GET_LOCK() |
获取命名锁 |
IS_FREE_LOCK() |
命名锁是否空闲 |
IS_USED_LOCK() |
命名锁是否正在使用;如果为真,则返回连接标识符 |
RELEASE_LOCK() |
释放命名锁 |
尝试使用 string 给定的名称获取锁
str
,使用超时timeout
秒数。负值timeout
意味着无限超时。锁是独占的。当由一个会话持有时,其他会话无法获得同名锁。1
如果成功获得锁,0
如果尝试超时(例如,因为另一个客户端先前已锁定该名称),或者NULL
是否发生错误(例如内存不足或线程被 mysqladmin kill 杀死), 则 返回。当您的会话终止(正常或异常)时
GET_LOCK()
,通过执行或隐式释放 获得的锁。 当事务提交或回滚时,不会释放使用RELEASE_LOCK()
获得的锁。GET_LOCK()
重要的GET_LOCK()
MySQL 5.7 中更改的行为。考虑到以后的升级,限制在str
64个字符以内,不要依赖后续调用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 节点相关的限制”。检查命名的锁是否
str
可以免费使用(即未锁定)。返回1
锁是否空闲(没有人在使用锁)、0
锁是否正在使用以及NULL
是否发生错误(例如不正确的参数)。此函数对于基于语句的复制是不安全的。如果您在
binlog_format
设置为 时使用此功能,则会记录一条警告STATEMENT
。检查指定的锁是否
str
正在使用(即锁定)。如果是,它返回持有锁的客户端会话的连接标识符。否则,它返回NULL
。此函数对于基于语句的复制是不安全的。如果您在
binlog_format
设置为 时使用此功能,则会记录一条警告STATEMENT
。str
释放以获得 的字符串命名的锁GET_LOCK()
。返回1
锁是否被释放,0
如果锁不是由这个线程建立的(在这种情况下锁没有被释放),NULL
如果命名的锁不存在。GET_LOCK()
如果锁从未通过调用获得或之前已被释放,则 锁不存在 。该
DO
语句与 一起使用很方便RELEASE_LOCK()
。请参阅 第 13.2.3 节,“DO 语句”。此函数对于基于语句的复制是不安全的。如果您在
binlog_format
设置为 时使用此功能,则会记录一条警告STATEMENT
。