Mysql триггеры, обновление той же записи

пример MySQL Trigger UPDATE


Триггеры в MySQL хороши для обновления, например, времени последнего доступа к записи,  которой работает какой-нибудь воркер/шедулер. Это позволяет видеть, какие данные "зависли" в обработке.

По этой же причине возложить функцию изменения времени на сам этот воркер/шедулер нельзя.

Помогает сама СУБД.

Триггер на UPDATE (BEFORE UPDATE/ AFTER UPDATE) позволяет менять данные прозрачно, особо за них не вспоминая.

Но есть нюанс: при AFTER UPATE весьма вероятна запись:

updating of new row is not allowed in after trigger
или
сan't update table '*' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

логика относительно очевидна: триггер реагирует на "после" отмашки "update", и если он будет выоплнять update, то будет сам себе эту отмашку и давать. В цикле до бесконечности.

Поэтому достаточно:
1) ввести некое поле "статус", которое менять при взятии данных в работу
2) на запись с этим полем повесить BEFORE UPDATE

CREATE TRIGGER `trigger` BEFORE UPDATE
ON `records`
FOR EACH ROW
    SET NEW.data==UNIX_TIMESTAMP(NOW());

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

разумеется, в других случаях нужно ставить другую логику:

http://stackoverflow.com/questions/32629099/updating-of-new-row-is-not-allowed-in-after-trigger

Комментарии