История изменений
Исправление byko3y, (текущая версия) :
C в ACID — это consistency.
Да, но консистентность определяется выполнением констрейнтов, а не как-то абстрактно
Слушай, а мне кажется, что ты прав. Ну то есть есть разные интерпретации, но вообще-то они появились потому, что всякие Oracle, MS SQL, MySQL, PostgreSQL и прочие чаще предпочитают не поддерживать Consistency, чем поддерживать ее. А вместо этого за «consistency» выдают «согласованность тухлых данных снимка».
Это история вроде криков про поддержку ANSI SQL в Oracle RDBMS, хотя по факту 2 из 4 режимов изоляции стандарта оно не поддерживает в принципе вообще никак (dirty read и read committed).
Элементарно две транзакции добавили две недопустимо похожих записи
Приведи пример
CREATE TABLE Persons (
PersonID int
);
Обе транзакции выполняют:
INSERT INTO Persons (PersonID)
SELECT 1
FROM dual
WHERE NOT EXISTS(SELECT *
FROM Persons
WHERE (PersonID = 1));
При одновременном их выполнении в таблице оказывается две записи с PersonID = 1, поскольку в начале обоих транзакций select * from Persons where (PersonID = 1)
был пустым множеством.
Правда, это не Write Skew, это просто несериализуемые транзакции — результат их одновременного выполнения отличается от последовательного выполнения. «Select for update» по всем прочитанным записям полностью устраняет феномен Write Skew и потому соответствует уровню Repeatable Reads из ANSI SQL, которое ниже уровня Serializable.
Исходная версия byko3y, :
C в ACID — это consistency.
Да, но консистентность определяется выполнением констрейнтов, а не как-то абстрактно
Слушай, а мне кажется, что ты прав. Ну то есть есть разные интерпретации, но вообще-то они появились потому, что всякие Oracle, MS SQL, MySQL, PostgreSQL и прочие чаще предпочитают не поддерживать Consistency, чем поддерживать ее. А вместо этого за «consistency» выдают «согласованность тухлых данных снимка».
Это история вроде криков про поддержку ANSI SQL в Oracle RDBMS, хотя по факту 2 из 4 режимов изоляции стандарта оно не поддерживает в принципе вообще никак (dirty read и read committed).
Элементарно две транзакции добавили две недопустимо похожих записи
Приведи пример
CREATE TABLE Persons (
PersonID int
);
Одна транзакция:
insert into Persons (PersonID)
select 1
from dual
where not exists(select *
from Persons
where (PersonID = 1));
Вторая транзакция та же самая. При одновременном их выполнении в таблице оказывается две записи с PersonID = 1, поскольку в начале обоих транзакций select * from Persons where (PersonID = 1)
был пустым множеством.
Правда, это не Write Skew, это просто несериализуемые транзакции — результат их одновременного выполнения отличается от последовательного выполнения. «Select for update» по всем прочитанным записям полностью устраняет феномен Write Skew и потому соответствует уровню Repeatable Reads из ANSI SQL, которое ниже уровня Serializable.