2015-09-02 22 views
0

我正在嘗試使用MariaDB 10.0.19的GET_LOCK()功能來實現一個系統,該系統將事件調度程序運行的事件限制爲一次只運行一個事件。基本上每個事件都試圖獲得一個'run_lock',如果它成功運行,否則它會一直等到鎖定可用或超時。問題是,在測試中,我發現很多情況下,即使存儲過程成功完成,我的存儲過程也不會釋放它的鎖。現在我知道在命令行測試時,鎖與我的會話相關聯 - 所以如果我退出鎖,就會釋放。我似乎無法測試/弄清楚,如果一個事件終止(通常或異常),所有的鎖都會被釋放?MySQL/MariaDB GET_LOCK lifecyle with Events

回答

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 ; 

聲明沒有釋放共享鎖。在事件退出後,鎖確實會被解鎖,通常或異常。所以我推測每個事件都在它自己的會話中運行,並在退出時釋放所有的鎖。