本节介绍用于操纵用户级锁的函数。
表12.19锁定函数
的名字 | 描述 |
---|---|
GET_LOCK () |
得到一个命名的锁 |
IS_FREE_LOCK () |
命名锁是否空闲 |
is_used_lock() |
命名锁是否在使用中;如果为真,返回连接标识符 |
RELEASE_ALL_LOCKS () |
释放当前所有已命名锁 |
RELEASE_LOCK () |
释放命名锁 |
尝试使用字符串给出的名称获取锁定
str
,使用超时超时
秒。一个负超时
值意味着无限超时。锁是独家的。虽然由一个会话持有,但其他会话无法获取相同名称的锁定。返回
1
如果成功获得锁,0
如果尝试超时(例如,因为另一个客户端之前锁定了名称),或者空值
如果发生错误(例如内存耗尽或线程被杀死mysqladmin杀人)。获得的锁
GET_LOCK ()
是通过执行显式释放的RELEASE_LOCK ()
或者在您的会话终止时隐含(通常或异常)。用来获得的锁GET_LOCK ()
当事务提交或回滚时未释放。GET_LOCK ()
是使用元数据锁定(MDL)子系统实现的。可以同时获得多个锁GET_LOCK ()
不释放任何现有的锁。例如,假设你执行以下语句:选择GET_LOCK (lock1, 10);选择GET_LOCK (lock2, 10);选择RELEASE_LOCK(“lock2”);选择RELEASE_LOCK(“lock1”);
第二
GET_LOCK ()
获取第二个锁以及两者RELEASE_LOCK ()
调用返回1(成功)。对于给定的会话,甚至可能用于为同一名称获取多个锁。在获取会话释放其名称的所有锁之前,其他会话无法获取锁定该名称。
获取的独特命名的锁
GET_LOCK ()
出现在性能架构中元数据_Locks.
桌子。的object_type.
列表示用户级锁
和OBJECT_NAME
列表示锁名称。对象获取多个锁的情况下相同名称,只有名称的第一个锁定寄存器中的一行元数据_Locks.
桌子。随后的锁定名称递增锁定的计数器,但不获取其他元数据锁。的元数据_Locks.
当释放名称上的最后一个锁定实例时,将删除锁的行。获得多个锁的能力意味着客户端之间存在死锁的可能性。当发生这种情况时,服务器选择调用者并使用
er_user_lock_deadlock.
错误。此错误不会导致交易回滚。MySQL在64个字符的锁名称上强制执行最大长度。
GET_LOCK ()
可用于实现应用程序锁或模拟记录锁。名称锁定在服务器范围内。如果名称已在一个会话中被锁定,GET_LOCK ()
通过另一个会话拦截具有相同名称的锁的任何请求。这使得在给定的锁名称上同意的客户端可以使用该名称执行合作咨询锁定。但是,请注意,它还使客户端也能够无意中或故意锁定名称的协作客户端中的客户端,从而防止任何协作客户端锁定该名称。减少这一点的一种方法是使用具有特定于数据库或特定于应用程序的锁名。例如,使用表单的锁定名称db_name.str
或者app_name.str.
.如果多个客户端正在等待锁,则它们获取其的顺序是未定义的。应用程序不应该假设客户端以与其发出锁定请求的相同顺序获取锁定。
GET_LOCK ()
对基于语句的复制不安全。如果使用此功能,则记录警告binlog_format.
设定为声明
.警告通过获取多个命名锁的功能,可以进行单个语句来获取大量锁。例如:
插入……SELECT GET_LOCK(t1.col_name) FROM t1;
这些类型的陈述可能有一定的负面影响。例如,如果语句部分失败并回滚,那么在故障点之前获得的锁仍然存在。如果意图是插入的行和获得的锁之间有对应关系,那么这个意图就不满足。另外,如果以某种顺序授予锁很重要,请注意,根据优化器选择的执行计划,结果集顺序可能会有所不同。由于这些原因,最好将应用程序限制为每个语句只能有一个锁获取调用。
不同的锁定接口可用作插件服务或一组可加载功能。与所提供的接口不同,此接口提供锁定命名空间和不同的读写锁定锁定
GET_LOCK ()
和相关功能。有关详细信息,请参见第5.6.9.1节“锁定服务”.检查锁是否命名
str
免费使用(即不上锁)。返回1
如果锁是免费的(没有人使用锁),0
如果锁正在使用中,那么空值
如果发生错误(例如不正确的参数)。基于语句的复制,此功能不安全。如果使用此功能,则记录警告
binlog_format.
设定为声明
.检查锁是否命名
str
正在使用(即锁定)。如果是这样,它会返回保存锁的客户端会话的连接标识符。否则,它返回空值
.基于语句的复制,此功能不安全。如果使用此功能,则记录警告
binlog_format.
设定为声明
.发布当前会话所持持有的所有命名锁,并返回释放的锁数(如果没有)
基于语句的复制,此功能不安全。如果使用此功能,则记录警告
binlog_format.
设定为声明
.释放以字符串命名的锁
str
那是如此GET_LOCK ()
.返回1
如果锁被释放,0
如果这个线程没有建立锁(在这种情况下锁没有被释放),那么空值
如果未存在命名锁。如果从未通过呼叫获得的话,锁定不存在GET_LOCK ()
或者之前是否已经发布过。的
做
声明方便使用RELEASE_LOCK ()
.看第13.2.3条“出口声明”.基于语句的复制,此功能不安全。如果使用此功能,则记录警告
binlog_format.
设定为声明
.