MySQL / MariaDB GET_LOCK lifecyle with Events

时间:2015-09-02 18:30:33

标签: mysql events locking mariadb

我正在尝试使用MariaDB 10.0.19的GET_LOCK()功能来实现一个系统,该系统将事件调度程序运行的事件限制为一次只运行一个。基本上每个事件都试图获取一个'run_lock',如果成功则运行,否则它会一直等到锁可用或超时。问题是,在测试中,我可以找到很多情况,即使存储过程成功完成,我的存储过程也不会释放锁。现在我知道在命令行测试时锁与我的会话相关联 - 所以如果我退出锁被释放。我似乎无法测试/弄清楚是否一个事件终止(正常或异常)将释放所有锁?

1 个答案:

答案 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 ;

注意没有释放共享锁。事件退出后,锁定确实会被解锁,无论是正常还是异常。因此,我推测每个事件都在其自己的会话中运行,并在退出时释放所有锁。