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

Одним из основных свойств транзакции является изолированность. Под изолированностью подразумеваются ограничения на одновременное чтение или изменение данных в параллельно работающих транзакциях.

MSS поддерживает пять уровней изолированности транзакций: READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SNAPSHOT и SERIALIZABLE. Для установки уровня изолированности текущей для транзакций в текущем подключении служит инструкция SET TRANSACTION ISOLATION LEVEL.

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

На рис. 13.46 схематически изображена проблема неподтвержденного чтения. Двумя прямоугольниками с метками A и B на схеме изображены параллельные транзакции. Направленная линия между прямоугольниками представляет ось времени с двумя отметками t1 и t2. До момента t1 транзакцией B выполняется два оператора: INSERT и UPDATE. Эти операторы изменяют таблицы БД, но до момента времени t2 не фиксируют и не откатывают эти изменения.

После момента t1 транзакция A считывает содержимое таблиц, измененных транзакцией B, и «видит» измененные или добавленные транзакцией B строки. При этом изменения остаются до момента t2 в неподтвержденном состоянии, т. е. могут быть как зафиксированными, так и отмененными. Другими словами: неподтвержденное чтение фактически свидетельствует об отсутствии изолированности транзакций.

Рис. 13.46. Схема, демонстрирующая неподтвержденное чтение

 

Схема на рис. 13.47 демонстрирует проблему неповторяющегося чтения. Как и ранее, на схеме изображены две параллельно работающие транзакции A и B, выполняющие операции с БД в рамках трех интервалов времени.

Рис. 13.47. Схема, демонстрирующая неповторяющееся чтение

До момента t1 транзакция A выполняет чтение строк из таблиц БД с помощью оператора SELECT.

После момента t1, но до момента t2 транзакция B выполняет изменение строк, прочитанных в транзакции A, и фиксирует эти изменения (COMMIT).

После момента t2 транзакция A повторяет чтение тех же строк и «видит» изменения, выполненные транзакцией B. Другими словами: при повторном чтении данных транзакцией не гарантируется, что они не изменены или не удалены другой транзакцией.

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

Рис. 13.48. Схема, демонстрирующая фантомное чтение

 

В табл. 13.3 перечислены все пять уровней изолированности транзакций, поддерживаемых MSS. Для каждого уровня символом «плюс» отмечается наличие соответствующей проблемы. Например, уровень READ COMMITTED (действует по умолчанию) не допускает неподтвержденного чтения, но при этом возможно неповторяющееся и фантомное чтение, а уровень SERIALIZABLE решает все три проблемы.

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

Дело в том, что изолированность транзакций достигается с помощью механизма блокировок. Например, пусть для транзакции A установлен уровень REPEATABLE READ (рис. 13.47), а параллельно работающая транзакция B пытается изменить (оператор UPDATE) предварительно считанную (SELECT) транзакцией A строку.

 

 

Таблица 13.3

Дата: 2019-02-25, просмотров: 240.