2017-02-17 36 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

相关问题