RELEASE_ALL_LOCKS

释放当前会话持有的所有用户级 advisory 锁,返回已释放的锁数量。这是 MatrixOne 扩展 函数——MySQL 在会话关闭时自动释放锁,但不提供一次性释放全部锁的等价函数。

语法

RELEASE_ALL_LOCKS()

参数

该函数不接受任何参数。

返回值

  • 返回已释放的锁数量(BIGINT)。

  • 若会话未持有任何锁,返回 0

使用说明

  • RELEASE_ALL_LOCKS() 释放当前会话通过 GET_LOCK() 获取的所有命名 advisory 锁,不 影响其他会话持有的锁。

  • 调用 RELEASE_ALL_LOCKS() 后,对于之前持有的锁,IS_USED_LOCK() 返回 NULL, 且 IS_FREE_LOCK() 返回 1

  • 锁也会在会话结束时自动释放。

示例

DROP DATABASE IF EXISTS release_all_locks_demo;
CREATE DATABASE release_all_locks_demo;
USE release_all_locks_demo;

-- 获取多个锁
SELECT GET_LOCK('lock_a', 0);
-- 返回 1

SELECT GET_LOCK('lock_b', 0);
-- 返回 1

-- 验证锁已被持有
SELECT IS_USED_LOCK('lock_a') IS NOT NULL;
-- 返回 1

SELECT IS_USED_LOCK('lock_b') IS NOT NULL;
-- 返回 1

-- 一次性释放所有锁
SELECT RELEASE_ALL_LOCKS();
-- 返回 2(释放了两个锁)

-- 验证锁已空闲
SELECT IS_FREE_LOCK('lock_a');
-- 返回 1

SELECT IS_FREE_LOCK('lock_b');
-- 返回 1

-- 无锁时再次调用
SELECT RELEASE_ALL_LOCKS();
-- 返回 0

-- 获取单个锁并全部释放
SELECT GET_LOCK('lock_c', 0);
SELECT RELEASE_ALL_LOCKS();
-- 返回 1

DROP DATABASE release_all_locks_demo;

另请参阅