Сбой транзакции «Промежуточная согласованность» - PullRequest
0 голосов
/ 25 марта 2020

Привет всем PostgreSQL / MySQL / SQLite экспертам и заранее благодарим за ваши мысли.

Рассмотрим следующий скрипт:

CREATE TABLE T (Col1 INT PRIMARY KEY);

INSERT INTO T VALUES (1), (2);

UPDATE T SET Col1 = Col1 + 1;

Выполнение его либо в PostgreSQL , MySQL, или SQLite приводит к ошибке нарушения первичного ключа.

Однако следующий код завершается успешно:

CREATE TABLE T (Col1 INT PRIMARY KEY);

INSERT INTO T VALUES (1), (2);

UPDATE T SET Col1 = Col1 - 1;

Oracle и SQL Сервер ведет себя как ожидалось, и одинаковые (эквивалентные Oracle) сценарии успешно выполняются и фиксируются без ошибок, как они должны ИМХО.

Кажется, что успех или неудача транзакции для PostgreSQL, MySQL и SQLite зависят от некоторый физический порядок обновления и ограничения проверяются для каждой строки перед завершением обновления. Насколько я понимаю, это нарушает фундаментальный принцип «все сразу».

Для меня это не имеет никакого смысла. Чего мне не хватает?

Будьте в безопасности и здоровы!

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Это хороший вопрос, и это скорее расширенный комментарий.

Я думаю, вы правы в своем понимании свойств ACID - либо вся транзакция зафиксирована, либо ни одна из них. И, если данные действительны в конце транзакции, они должны совпадать.

Я не уверен на 100%, что это указано в стандарте. В любом случае ограничения могут иметь некоторую свободу в стандарте с точки зрения того, реализованы ли они «на строку», «на оператор» или «на транзакцию». На самом деле последнее кажется маловероятным.

Как вы заметили, разные базы данных обрабатывают это по-разному. Отмечу, что моя рекомендация по решению этой проблемы обычно включает два обновления:

update t
    set col1 = - col1;

update t
    set col1 = (- col1) + 1;

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

0 голосов
/ 25 марта 2020

Насколько я знаю, в SQL нет принципа "все сразу".

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...