MySql - 表名交换是否是原子操作
MySql - Is tables name swap is an atomic operation
我有一个table,暂且称它为myTbl
。
我还有两个 tables - Monitor
和 Monitor_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
的更新。
现在我的问题是我是否会使用
交换 Monitor
和 Monitor_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 ;
我有一个table,暂且称它为myTbl
。
我还有两个 tables - Monitor
和 Monitor_bkp
。
现在我构建了一个触发器,只要 myTbl
:
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
的更新。
现在我的问题是我是否会使用
Monitor
和 Monitor_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 ;