MySql - 表名交换是一个原子操作

时间:2015-12-08 11:13:28

标签: mysql triggers atomic

我有一张桌子,我们称之为myTbl。 我还有两个表 - 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;

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

2 个答案:

答案 0 :(得分:2)

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

这也意味着RENAME TABLE将等待触及表的所有事务完成,并且在等待它时将锁定尝试触摸表的每个后续事务。

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

答案 1 :(得分:0)

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

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

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

    # rest of trigger logic

END $$
DELIMITER ;