Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции / Л-6 - Сеансы, транзакции и блокировки

.pdf
Скачиваний:
13
Добавлен:
28.06.2021
Размер:
569.37 Кб
Скачать

Изменение @@TRANCOUNT при откате

Оператор BEGIN TRAN увеличивает число транзакций на 1. Оператор ROLLBACK очищает значение переменной @@TRANCOUNT , т. к. все активные транзакции отменены.

Точки сохранения

Концепция точек сохранения привносит в транзакции дополнительный уровень гранулярности. Позволяет определить в транзакции именованную метку (как правило, после выполнения ключевой инструкции).

Если после установки точки сохранения произойдет какой-либо сбой, то откат будет выполнен не до начала транзакции, а до этой точки сохранения.

Явные инструкции COMMIT (равно как и неявные, выполняемые до и после инструкции DDL) освобождают память от информации о точках сохранения.

Использование точки сохранения (1)

Использование точки сохранения (2)

Проблема потерянных обновлений (Lost Update)

Если пользователи параллельно обновляют одни и те же данные, то запомнится обновление, проведенное последним. Остальные будут потеряны.

Проблема потерянных обновлений (пример)

Проблема несогласованных данных

Пользователь может увидеть данные, которые были обновлены другим пользователем, но эти обновления не были зафиксированы. Второй пользователь может

провести откат (грязное чтение Dirty Read).

Проблема несовместимого анализа

Пользователь проводит групповую обработку данных, а какие-то значения обрабатываемого множества изменяются в результате параллельной транзакции:

неповторяющееся чтение – проводится изменение существующих записей;

фантомная вставка (строки-призраки) – проводится вставка новой записи.

Сериализация транзакций

СУБД должна использовать методы регулирования параллельных транзакций, которые должны удовлетворять следующим правилам:

в ходе транзакции пользователь видит только согласованные данные (он не должен видеть несогласованные промежуточные данные);

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

Конфликты между транзакциями

транзакция 2 пытается изменять объект, измененный незакончившейся транзакцией 1 (конфликт W-W, запись-запись);

транзакция 2 пытается изменять объект, прочитанный незакончившейся транзакцией 1 (конфликт R-W, чтение-запись);

транзакция 2 пытается читать объект, измененный незакончившейся транзакцией 1 (конфликт W-R, запись-чтение).