эффекты, вызванные параллельным выполнением транзакций, и способы их устранения. Управление транзакциями и способы обработки ошибок
Транзакция — это последовательность операций, выполняемая как единое целое. Транзакции нужны для поддержания целостности сущностей.
https://habr.com/ru/post/555920/
Для поддержания целостности транзакция должна обладать четырьмя свойствами АСИД. Эти свойства называются также ACID-свойствами (in English):
Атомарность (Atomicity)
Либо выполняется целиком, либо не выполняется вовсе.
Согласованность (или Непротиворечивость) (Consistency)
Не нарушает бизнес-логику и отношения между элементами данных.
Изоляция (Isolation)
Результаты транзакции самодостаточны, они не зависят от предыдущих или следующих транзакций.
Долговечность (или Устойчивость) (Durability)
После заверщения, происходит фиксация транзакции, и становится невозможным откат до состояния до начала транзакции.
По признаку определения границ различают:
Автоматические транзакции
Режим автоматической фиксации транзакций является режимом управления транзакциями по умолчанию. В этом режиме каждая инструкция T-SQL выполняется как отдельная транзакция. Если выполнение инструкции завершается успешно, происходит фиксация; в противном случае происходит откат. Если возникает ошибка компиляции, то план выполнения пакета не строится и пакет не выполняется.
CREATE TABLE Tab1 (
Col1 int NOT NULL PRIMARY KEY,
Col2 char(3)
);
INSERT INTO Tab1 VALUES (1, 'aaa');
INSERT INTO Tab1 VALUES (2, 'bbb');
INSERT INTO Tab1 VALUES (1, 'ccc'); -- Ошибка времени исполнения. Откат
SELECT * FROM Tab1; -- Возвращаются две строки.
Неявные транзакции
Если соединение работает в режиме неявных транзакций, то после фиксации или
отката текущей транзакции автоматически начинает новую транзакцию. В этом
режиме явно указывается только граница окончания транзакции с помощью инструкций COMMIT TRANSACTION
и ROLLBACK TRANSACTION
.
CREATE TABLE Tab1 (
Col1 int NOT NULL PRIMARY KEY,
Col2 char(3) NOT NULL
);
-- Первая неявная транзакция, начатая оператором INSERT
INSERT INTO Tab1 VALUES (1, 'aaa');
INSERT INTO Tab1 VALUES (2, 'bbb');
COMMIT TRANSACTION; -- Фиксация первой транзакции
-- Вторая неявная транзакция, начатая оператором INSERT
INSERT INTO Tab1 VALUES (3, 'ccc');
SELECT * FROM Tab1;
COMMIT TRANSACTION; -- Фиксация второй транзакции