пример 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
Комментарии
Отправить комментарий