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 ;