gpt4 book ai didi

mysql - 如果最后一个事件仍在执行,如何设置 MySQL 事件不触发

转载 作者:行者123 更新时间:2023-11-29 07:04:26 25 4
gpt4 key购买 nike

我通常如下设置MySql Events,其中UpdateTable()是一个更改表数据的存储过程。

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 调用?

谢谢

最佳答案

你不能直接。

当然是间接的。

在程序内部,在进行任何其他工作之前:

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 错误日志中。

关于mysql - 如果最后一个事件仍在执行,如何设置 MySQL 事件不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42289166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com