MySQL транзакция и триггер - PullRequest
10 голосов
/ 14 апреля 2010

Я быстро просмотрел руководство по MySQL, но не нашел точной информации по моему вопросу. Вот мой вопрос: если у меня есть таблица InnoDB A с двумя триггерами, запускаемыми «AFTER INSERT ON A» и «AFTER UPDATE ON A». Более конкретно, например: один триггер определен как:

CREATE TRIGGER test_trigger AFTER INSERT ON A
         FOR EACH ROW 
                      BEGIN
                         INSERT INTO B SELECT * FROM A WHERE A.col1 = NEW.col1
                      END;

Вы можете игнорировать запрос между BEGIN И END, в основном я имею в виду, что этот триггер вставит несколько строк в таблицу B, которая также является таблицей InnoDB.

Теперь, если я запустил транзакцию и затем вставил много строк, скажем: 10K строк, в таблицу A. Если с таблицей A нет триггера, все эти вставки являются атомарными, это точно. Теперь, если таблица A связана с несколькими триггерами вставки / обновления, которые вставляют / обновляют много строк в таблицу B и / или таблицу C и т. Д. Будут ли все эти вставки и / или обновления все еще атомарными?

Я думаю, что он все еще атомарный, но его сложно проверить, и я не могу найти никаких объяснений в Руководстве. Кто-нибудь может это подтвердить?

Ответы [ 2 ]

6 голосов
/ 02 июля 2015

И под атомарным вы подразумеваете, что если один оператор в триггере завершится неудачно, весь оператор потерпит неудачу. Да - триггер выполняется в контексте транзакции оператора. И нет, конечно, если нет транзакции, то нет контекста транзакции.

Для транзакционных таблиц сбой оператора должен вызывать откат всех изменений, выполненных оператором. Сбой триггера приводит к сбою оператора, поэтому сбой триггера также вызывает откат. Для нетранзакционных таблиц такой откат не может быть выполнен, поэтому, хотя оператор не выполняется, любые изменения, выполненные до точки ошибки, остаются в силе.

И вам не разрешено начинать транзакцию в триггере.

3 голосов
/ 10 июня 2010

Они должны быть атомарными, если это сделано в транзакции. Страница MySQL о триггерах содержит соответствующую информацию.

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

...