Это не одно и то же, но они не связаны.
В обоих случаях механизм можно описать примерно так:
- Некоторый блок кода объявляет «интерес» к изменениям состояния.
- Ваше приложение влияет на некоторые изменения.
- Система запускает блок кода в ответ на изменение.
Возможно, триггер базы данных больше похож на функцию обратного вызова, которая зарегистрировала интерес к определенному событию.
Вот аналогия: событие — это резиновый мячик, который вы бросаете. Триггер — это собака, которая гонится за брошенным мячом.
Если вы имеете в виду какое-то другое различие, которое делает его «опасным» (примечание: OP отредактировал этот выбор слова, исключенный из вопроса) для сравнения триггеров и событий, вы можете описать, что вы имеете в виду.
Триггеры — это способ синхронно вставить повторяющуюся логику в поток выполнения (т. е. синхронность). События — это средство отложить логику на потом (т. е. реализовать асинхронность).
Хорошо, я понимаю, что вы имеете в виду, более ясно. Но я думаю, что это в некотором роде зависит от реализации. Я бы не стал предполагать, что обработчик событий должен отменить регистрацию; это зависит от системы, которую вы используете. Обработчик сигнала UNIX, например, должен предотвратить перехват нового сигнала, пока он уже обрабатывает его. Но сервлет Java внутри контейнера Tomcat должен быть потокобезопасным, поскольку он может вызываться одновременно несколькими потоками. Оба они являются обработчиками событий разных типов.
Обработчики событий могут быть синхронными или асинхронными. Может ли обработчик в системе публикации/подписки читать сообщения, которые были отправлены недавно, но до того, как обработчик зарегистрировал свой интерес? Или только сообщения, размещенные одновременно?
Есть еще одна важная причина рассматривать триггеры как отличные от обработчиков событий: я часто рекомендую против делать в триггере что-либо, что влияет на состояние вне базы данных.
Например, отправка электронной почты, запись в файл, отправка в веб-службу или разветвление процесса внутри триггера неуместны. Если ни по какой другой причине, кроме транзакции, породившей триггер, можно откатить, но вы не можете откатить эти внешние эффекты. Возможно, вы даже не используете явные транзакции, но говорите, что отправляете электронное письмо в триггере BEFORE, но операция не выполняется из-за ограничения NOT NULL или чего-то еще.
Вместо этого вся такая работа должна выполняться кодом в приложении, после подтверждения того, что операция SQL прошла успешно и транзакция зафиксирована.
Очень плохо, что люди продолжают пытаться выполнять неподходящую работу внутри триггера. В MySQL есть старшие разработчики, которые продвигают UDF для чтения и записи данных в memcached. Вау! Я только что заметил, что они сделали это в продукт MySQL 6.0!! Шокирует!
Итак, вот еще одна попытка провести аналогию, сравнивая триггеры и события с процессом уголовного процесса:
- Триггер BEFORE — это утверждение.
- Триггер ПОСЛЕ — это обвинительный акт.
- COMMIT — осуждение после вынесения обвинительного приговора.
- ROLLBACK - это оправдательный приговор после невиновного приговора.
Вы хотите посадить преступника в тюрьму только после того, как он будет осужден.
- Тогда как СОБЫТИЕ - это само преступление.
person
Bill Karwin
schedule
30.01.2009