MySql - 表名交换是否是原子操作

MySql - Is tables name swap is an atomic operation

我有一个table,暂且称它为myTbl。 我还有两个 tables - MonitorMonitor_bkp。 现在我构建了一个触发器,只要 myTbl:

中有更新,就会在 Monitor 中创建一个新行
CREATE TRIGGER mon_task_after_update_task 
AFTER UPDATE ON myTbl
FOR EACH ROW INSERT INTO Monitor VALUES(new.id, SYSDATE())
    ON DUPLICATE KEY UPDATE last_modified=SYSDATE();

一切正常,而且我一直有很多 myTbl 的更新。 现在我的问题是我是否会使用

交换 MonitorMonitor_bkp 的名称
RENAME TABLE foo TO foo_old, foo_new To foo;

触发器是否有可能在交换进行时触发,如果是这样,它会失败吗?

根据 the manual(以及我使用此功能进行日志轮换的经验),该操作是原子操作,尝试使用 table 的线程必须等待 RENAME TABLE去完成。

这也意味着 RENAME TABLE 将等待所有触及 table 的事务完成,并且在等待期间它将锁定每个试图触及 table 的后续事务秒。

基本上,在交换期间最长的交易期间,所有内容都会冻结,但会保持一致。

正如 Vatev 已经提到的,触发器不会触发。

如果您仍然对它(或任何其他用途)感到焦虑,您可能需要将用户定义的变量(例如 @ALLOW_TRIGGER)添加到您的程序逻辑中,并在触发器中检查它的值:

DELIMITER $$
myTrigger: BEGIN
    IF (@ALLOW_TRIGGER = FALSE)
    THEN
        LEAVE myTrigger
    END;

    # rest of trigger logic

END $$
DELIMITER ;