2015-12-08 3 views
0

У меня есть таблица, назовем ее myTbl. У меня также есть две таблицы - Monitor и Monitor_bkp. теперь я построил Trigger, чтобы создать новую строку в монитор каждый раз, когда это обновление в myTbl:MySql - это замена имен таблиц - это атомная операция

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; 

Есть ли возможность триггер будет срабатывать в то время как обмен происходит, и если так будет терпеть неудачу?

ответ

1

Согласно the manual (и мой опыт использования этой функции для вращения журнала) операция является атомарной, а потоки, пытающиеся использовать таблицу, должны ждать завершения RENAME TABLE.

Это также означает, что RENAME TABLE будет ожидать все транзакции, которые касаются таблиц до конца, и, ожидая, он заблокирует каждую последующую транзакцию, которая пытается коснуться таблиц.

В принципе, все будет зависеть на протяжении самой продолжительной транзакции во время обмена, но будет последовательным.

0

Как уже упоминал Ватев, триггер не срабатывает.

Если вы все еще чувствуете беспокойство по этому поводу (или для любых других целей), вы можете добавить пользовательскую переменную (например @ALLOW_TRIGGER) в вашей логике программы и проверить ее значение внутри триггера:

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

    # rest of trigger logic 

END $$ 
DELIMITER ; 
+0

Tnx для ответа, но я пытаюсь свести триггер к минимуму, урок, извлеченный из личных ошибок –

Смежные вопросы