MySQL/MariaDB GET_LOCK 事件生命周期
MySQL/MariaDB GET_LOCK lifecyle with Events
我正在尝试使用 MariaDB 10.0.19 的 GET_LOCK()
功能来实现一个系统,该系统通过事件调度程序将事件 运行 限制为一次仅 运行 一个。本质上,每个事件都会尝试获取一个 'run_lock',如果成功,它会获取 运行s,否则它会一直等到锁可用或超时。问题是,在测试中,我发现很多情况下我的存储过程即使成功完成也不会释放它的锁。现在我知道在命令行测试时锁与我的会话相关联 - 所以如果我退出锁被释放。我似乎无法 test/figure 的是,如果一个事件终止(正常或异常),它的所有锁都会被释放吗?
所以我创建了两个活动
DELIMITER //
DROP EVENT IF EXISTS test_lock_1;
CREATE EVENT test_lock_1
ON SCHEDULE EVERY 1 MINUTE STARTS NOW()
DO this_event:BEGIN
SELECT GET_LOCK('test', 75);
SELECT SLEEP(55);
END //
DELIMITER ;
DELIMITER //
DROP EVENT IF EXISTS test_lock_2;
CREATE EVENT test_lock_2
ON SCHEDULE EVERY 30 SECOND STARTS NOW()
DO this_event:BEGIN
SELECT GET_LOCK('test', 25);
SELECT SLEEP(45);
END //
DELIMITER ;
注意没有释放共享锁。事件结束后,锁确实被解锁了,正常或异常。所以我推测每个事件都在它自己的会话中运行,并且在退出时所有锁都被释放。
只有成功获取锁才能继续
DELIMITER //
CREATE EVENT test_lock_1 ON SCHEDULE EVERY 1 MINUTE DO
BEGIN
IF GET_LOCK('test', 30) IS TRUE THEN
SELECT SLEEP(65);
END IF;
END //
DELIMITER ;
我正在尝试使用 MariaDB 10.0.19 的 GET_LOCK()
功能来实现一个系统,该系统通过事件调度程序将事件 运行 限制为一次仅 运行 一个。本质上,每个事件都会尝试获取一个 'run_lock',如果成功,它会获取 运行s,否则它会一直等到锁可用或超时。问题是,在测试中,我发现很多情况下我的存储过程即使成功完成也不会释放它的锁。现在我知道在命令行测试时锁与我的会话相关联 - 所以如果我退出锁被释放。我似乎无法 test/figure 的是,如果一个事件终止(正常或异常),它的所有锁都会被释放吗?
所以我创建了两个活动
DELIMITER //
DROP EVENT IF EXISTS test_lock_1;
CREATE EVENT test_lock_1
ON SCHEDULE EVERY 1 MINUTE STARTS NOW()
DO this_event:BEGIN
SELECT GET_LOCK('test', 75);
SELECT SLEEP(55);
END //
DELIMITER ;
DELIMITER //
DROP EVENT IF EXISTS test_lock_2;
CREATE EVENT test_lock_2
ON SCHEDULE EVERY 30 SECOND STARTS NOW()
DO this_event:BEGIN
SELECT GET_LOCK('test', 25);
SELECT SLEEP(45);
END //
DELIMITER ;
注意没有释放共享锁。事件结束后,锁确实被解锁了,正常或异常。所以我推测每个事件都在它自己的会话中运行,并且在退出时所有锁都被释放。
只有成功获取锁才能继续
DELIMITER //
CREATE EVENT test_lock_1 ON SCHEDULE EVERY 1 MINUTE DO
BEGIN
IF GET_LOCK('test', 30) IS TRUE THEN
SELECT SLEEP(65);
END IF;
END //
DELIMITER ;