Проблема потери результатов обновления




Считается, что передача обработки элементарных операций нескольких транзакций происходит в момент освобождения процессора (например, при записи или чтения данных из внешней памяти).

Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения.

Время Транзакция A Транзакция B
Чтение ---
Запись ---
--- Чтение
--- Запись
COMMIT ---
--- COMMIT
  Потеря результата обновления  

Результат. После окончания обеих транзакций, строка содержит значение , занесенное более поздней транзакцией B. Транзакция A ничего не знает о существовании транзакции B, и ожидает в строке значение . Таким образом, транзакция A потеряла результаты своей работы.

 

12. Проблема незафиксированной зависимости (чтение "грязных" данных)

Транзакция B изменяет данные в строке. После этого транзакция A считывает измененные данные и работает с ними. Транзакция B откатывается и восстанавливает старые данные.

 

Время Транзакция A Транзакция B
--- Чтение
--- Запись
Чтение ---
Работа с прочитанными данными ---
--- Rollback tran
COMMIT ---
  Работа с "грязными" данными  

Результат. Транзакция A в своей работе использовала данные, которых фактически не было в БД. Так как после отката транзакции B, восстановит данные, как если бы она вообще никогда не выполнялась. Таким образом, результаты работы транзакции A некорректны, т.к. она работала с данными, отсутствовавшими в БД.

Неповторяемое считывание

Транзакция A дважды читает одну и ту же строку. Между этими чтениями вклинивается транзакция B, которая изменяет значения в строке.

Время Транзакция A Транзакция B
Чтение ---
--- Чтение
--- Запись
--- COMMIT
Повторное чтение ---
COMMIT ---
  Неповторяемое считывание  

 

Результат. Транзакция A не знает о существовании транзакции B, и, т.к. сама не меняет значение в строке, то ожидает, что после повторного чтения значение будет тем же самым. Транзакция A работает с данными, которые, с точки зрения транзакции A, самопроизвольно изменяются.

Фиктивные элементы (фантомы)

Транзакция A дважды выполняет выборку строк с одним и тем же условием. Между выборками вклинивается транзакция B, которая добавляет новую строку, удовлетворяющую условию отбора.

Время Транзакция A Транзакция B
S-блокировка строк, удовлетворяющих условию . (Заблокировано n строк) ---
Выборка строк, удовлетворяющих условию . (Отобрано n строк) ---
--- Вставка новой строки, удовлетворяющей условию .
--- COMMIT
S-блокировка строк, удовлетворяющих условию . (Заблокировано n+1 строка) ---
Выборка строк, удовлетворяющих условию . (Отобрано n+1 строк) ---
COMMIT ---
  Появились строки, которых раньше не было  

Результат. Блокировка на уровне строк не решила проблему появления фиктивных элементов.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: