Как выполнить N вставок в MySQL и в режиме «все или ничего» - PullRequest
0 голосов
/ 15 июня 2019

Мне нужно сделать N вставок в кучу таблиц, но если какая-то из них не удастся, я хочу, чтобы все вставки были свернуты.

Я использую MySql 8.0 и InnoDB, я потратил многоЯ пытался заставить его работать, и я прочитал, что для этого мне нужно использовать транзакции, но это не работает так, как мне бы хотелось, и я не знаю, как это исправить.

Этоопределение таблицы:

CREATE TABLE IF NOT EXISTS `Example` (
  `A` VARCHAR(30) NOT NULL,
  `ID` int NOT NULL,
  PRIMARY KEY (`ID`)
);

таблица содержит только запись ("abc", 1)

, поэтому я выполняю

START TRANSACTION;
INSERT INTO `Example` (`A`, `ID`) VALUES ("abd", 2);
INSERT INTO `Example` (`A`, `ID`) VALUES ("abc", 1);
COMMIT;

после транзакции ("abd ", 2) добавлено в таблицу.Я ожидаю, что не произойдет никаких изменений в таблице, поскольку вторая вставка, которая находится внутри транзакции, завершится неудачно

1 Ответ

0 голосов
/ 15 июня 2019

Ваш слой разграничения транзакций неверен.Вы выполняете COMMIT независимо от того, что 3-й оператор преуспевает или терпит неудачу (он терпит неудачу).

Это, вероятно, связано с тем, что операторы выполняются в командной строке один за другим, без учета условий ошибки.

API транзакций, такие как Spring, JTA и т. Д., «Обрекают» транзакцию при сбое 3-го оператора и никогда не будут выполнять коммит после этого.Вместо этого они переводят фиксацию в откат.

Например, в Spring вы разграничиваете транзакции, помечая метод аннотацией @Transactional.Вы никогда не выполняете коммит или откат программно;Spring делает это за вас, когда метод заканчивается.В этом случае любой RuntimeException, брошенный методом, обрекает транзакцию, и Spring откатится, когда метод завершит свое выполнение.В противном случае он совершит транзакцию.

...