Триггеры и неявные блокировки
Триггер может ссылаться на несколько таблиц, и если в одном из них используется LOCK TABLES оператор, другие таблицы могут в это же время также неявным образом заблокироваться из-за триггера.
Если триггер только читает из другой таблицы, она будет заблокирована для чтения. Если триггер записывает в другую таблицу, она будет заблокирована для записи. Если таблица заблокирована для чтения в результате LOCK TABLES, но должна быть заблокирована для записи, потому что она может быть изменена триггером, то на неё накладывается блокировка записи.
Все блокировки приобретаются вместе при выполнении LOCK TABLES оператора и освобождаются вместе при UNLOCK TABLES.
Пример
LOCK TABLE table1 WRITE
Предположим, что table1 содержит следующий триггер:
CREATE TRIGGER trigger1 AFTER INSERT ON table1 FOR EACH ROW
BEGIN
INSERT INTO table2 VALUES (1);
UPDATE table3 SET writes = writes+1
WHERE id = NEW.id AND EXISTS (SELECT id FROM table4);
END;
Не только table1 заблокирована для записи, table2 и table3 также заблокированы для записи из-за возможных INSERT и UPDATE, в то время как table4 заблокирована для чтения из-за SELECT.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/triggers-and-implicit-locks/