@coderlex

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

Положим, есть 2 таблицы, связанные посредством foreign key:
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 и post_comment на внутреннем уровне удаляются внутри ОБЩЕЙ транзакции или отдельной для удаления из post и отдельной для post_comment?

Другими словами, простое удаление из post (как в коде выше) на внутреннем уровне является аналогом вот этого (вариант 1):
START TRANSACTION
SELECT * FROM `post` WHERE `id` = 1 FOR UPDATE
DELETE FROM `post_comment` WHERE `post_id` = 1
DELETE FROM `post` WHERE `id` = 1
COMMIT

Или же аналогом этого (вариант 2):
START TRANSACTION
DELETE FROM `post_comment` WHERE `post_id` = 1
COMMIT
START TRANSACTION
DELETE FROM `post` WHERE `id` = 1
COMMIT


P.S. Также интересен вопрос отличий Postgres от InnoDB в этом плане. Поэтому, буду благодарен если в ответе укажите DBMS для которой он справедлив.
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
zoroda
@zoroda
Необычный Fullstack
В PostgreSQL тразнакция целостна. То есть, если выполняете DELETE FROM `post` WHERE `id` = 1, то все связанные удаления из `post_comment` будут в одной транзакции. Т.е. вариант 1.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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