2017-02-17 24 views
0

我通常按以下方式設置MySql Events,其中UpdateTable()是一個用於更改表數據的存儲過程。如何將MySQL事件設置爲在最後一個事件仍在執行時不觸發

CREATE EVENT UpdateTable_Every1Mins -- Create and Event 
ON SCHEDULE EVERY 1 MINUTE STARTS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE 
DO CALL UpdateTable(); 

有時,UpdateTable過程很耗時,最多可以跨越3分鐘。由於我已將間隔設置爲1分鐘(如上面的查詢所示),因此噹噹前UpdateTable調用仍在運行時,如何確保不觸發新的UpdateTable調用?

謝謝

回答

2

你不能,直接。

間接,當然。

裏面的程序,在任何其他的工作:

IF GET_LOCK('my_lock_name',0) IS NOT TRUE THEN 
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'failed to obtain lock; not continuing'; 
END IF; 

權前的程序結束:

DO RELEASE_LOCK('my_lock_name'); 

這是一個名爲鎖。它不會鎖定行或表,它只是在全局內存結構中鎖定名稱'my_lock_name'(您構成的名稱),以便其他線程不能鎖定相同的名稱。 0表示不等待鎖定,但如果其他人持有該鎖定,則立即返回false(0);如果發生錯誤,則立即返回null - IS NOT TRUE匹配null或0.請參閱手冊中的GET_LOCK()。以上代碼在MySQL Server 5.5或更高版本中運行。早期版本支持鎖,但不支持SIGNAL停止執行。

事件在技術上並不需要釋放鎖,因爲它在客戶端線程終止時被釋放,並且每個事件調用都在它自己的線程中,當事件調用結束時終止......但這是最佳實踐。

SIGNAL引發異常,該異常停止執行過程和此事件的調用。 message_text被記錄到MySQL錯誤日誌中。

+0

太棒了!感謝你的回答! – user1034912

相關問題