IS_USED_LOCK

返回持有指定用户级 advisory 锁的会话连接 ID;若该锁当前空闲(未被任何会话持有),则 返回 NULL。锁名不区分大小写,长度不超过 64 字符。

语法

IS_USED_LOCK(str)

参数

参数

说明

str

要检查的用户级 advisory 锁名称。不区分大小写,最大 64 字符。不能包含 NUL 字节。

返回值

  • 返回持有该锁的会话的连接 IDBIGINT UNSIGNED)。

  • 若锁处于空闲状态(未被任何会话持有),返回 NULL

  • 若锁名为 NULL,返回 NULL

使用说明

  • 锁名在查找前会归一化为小写。

  • 若无法确定锁持有者(例如该锁由旧版本 MatrixOne 获取),函数返回 NULL

  • 该函数与同一 MatrixOne 实例中的 GET_LOCK() 配合使用。

示例

DROP DATABASE IF EXISTS is_used_lock_demo;
CREATE DATABASE is_used_lock_demo;
USE is_used_lock_demo;

-- 创建记录锁持有者连接 ID 的表
CREATE TABLE lock_holder (conn_id BIGINT UNSIGNED);
INSERT INTO lock_holder VALUES (CONNECTION_ID());

-- 获取一个锁
SELECT GET_LOCK('demo_lock', 0);
-- 返回 1(锁获取成功)

-- 检查锁的持有者
SELECT IS_USED_LOCK('demo_lock') = (SELECT conn_id FROM lock_holder);
-- 返回 1(当前连接即为持有者)

-- 释放锁
SELECT RELEASE_LOCK('demo_lock');
-- 返回 1(锁已释放)

-- 锁现在空闲
SELECT IS_USED_LOCK('demo_lock');
-- 返回 NULL

-- 再次获取锁并一次性释放全部
SELECT GET_LOCK('demo_lock', 0);
SELECT IS_USED_LOCK('demo_lock') IS NOT NULL;
-- 返回 1(锁被持有)

SELECT RELEASE_ALL_LOCKS();

SELECT IS_USED_LOCK('demo_lock');
-- 返回 NULL(锁已释放)

-- 清理
DROP TABLE lock_holder;
DROP DATABASE is_used_lock_demo;

另请参阅