@coderlex

Строки из зависимых таблиц удаляются в единой/общей транзакции?

На пальцах. Есть 2 таблицы, связанные реляцией:
CREATE TABLE `post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  ..
  PRIMARY KEY (`id`)
);

CREATE TABLE `post_comment` (
  `post_id` int(11) NOT NULL,
  ...
  FOREIGN KEY (`post_id`) REFERENCES `post`(`id`) ON DELETE CASCADE
);

Когда я выполню:
DELETE FROM `post` WHERE `id` = 1
Перед непосредственным удалением этой записи будут удалены зависящие строки из `post_comment` согласно правилу foreign key.

Вопрос в том, будут ли строки из post и post_comment на внутреннем уровне заблокированы в ЕДИНОЙ транзакции или для удаления из каждой зависимой таблицы будет использована своя отдельная транзакция (т.е. отдельно для post и отдельно для post_comment)?

P.S. Также интересен вопрос отличий Postgres от InnoDB в этом плане. Поэтому, буду благодарен если в ответе укажите DBMS к которой он относится.
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ответы на вопрос 1
terrier
@terrier
Postgres:
Вопрос в том, будет ли эксклюзивно заблокирована строка из post на время выполнения всех этих операций

Собственно, да, всегда берется FOR UPDATE row-level lock, когда на строку делают delete, reference не влияет на это.
Посмотреть на локи можно примерно так.
Из одной консольки psql делаем
BEGIN;
delete from post where id = 1;

- в одной транзакции делаем delete ( понимаем, что он хватает лок на все, что удаляет )
Из другой консольки
BEGIN;
select * from post where id = 1 for update;

- эта транзакция пытается схватить лок на ту же строку, не может и ждет.

А вот что произойдет при роллбеке/коммите - это зависит от уровня изоляции транзакций.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы