我正在尝试使用MariaDB 10.0.19的GET_LOCK()
功能来实现一个系统,该系统将事件调度程序运行的事件限制为一次只运行一个。基本上每个事件都试图获取一个'run_lock',如果成功则运行,否则它会一直等到锁可用或超时。问题是,在测试中,我可以找到很多情况,即使存储过程成功完成,我的存储过程也不会释放锁。现在我知道在命令行测试时锁与我的会话相关联 - 所以如果我退出锁被释放。我似乎无法测试/弄清楚是否一个事件终止(正常或异常)将释放所有锁?
答案 0 :(得分:1)
所以我创建了两个事件
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 ;
注意没有释放共享锁。事件退出后,锁定确实会被解锁,无论是正常还是异常。因此,我推测每个事件都在其自己的会话中运行,并在退出时释放所有锁。