Уровень изоляции | Неподтвержденное чтение | Неповторяющееся чтение | Фантомное чтение |
READ UNCOMMTITTED | + | + | + |
READ COMMITED | – | + | + |
REPEATABLE READ | – | – | + |
SNAPSHOT | – | – | – |
SERIALIZABLE | – | – | – |
Для того чтобы транзакции A гарантировать заданный уровень изолированности, сервер установит на прочитанные этой транзакцией строки блокировку, запрещающую выполнять UPDATE в рамках другой транзакции. Это приведет к тому, что при попытке транзакцией B выполнить UPDATE для блокированной строки, транзакция B будет переведена в состояние ожидания до тех пор, пока транзакцией A не будет выполнен один из операторов завершения транзакции (COMMIT или ROLLBACK).
С одной стороны, чем выше уровень изолированности, тем меньше строк кода потребуется программисту при разработке приложения, но это приведет к увеличению времени выполнения параллельно работающих транзакций, при условии, что они работают с общими данными. С другой стороны, при низком уровне изолированности (например, READ COMMITTED) программисту придется предусматривать проблемы неповторяющегося и фантомного чтения.
Для исследования взаимодействия двух параллельных транзакций следует их выполнить в двух разных сеансах.
На рис. 13.49, 13.50 представлены два параллельно работающих сценария, содержащих явные транзакции A и B.
Рис. 13.49. Неподтвержденное чтение: транзакция A
Рис. 13.50. Неподтвержденное чтение: транзакция В
С помощью комментариев (рис. 13.49, 13.50) в обоих сценариях обозначены моменты времени t1 и t2, соответствующие одноименным временным засечкам на рис. 13.46. Кроме того, применяется системная встроенная функция @@SPID, возвращающая системный идентификатор процесса, назначенный сервером текущему подключению.
Для моделирования схемы, представленной на рис. 13.46, сценарии следует выполнять в три этапа:
1) последовательно оба сценария до отметки t1;
2) последовательно оба сценария c отметки t1 до отметки t2;
3) последовательно оба сценария c отметки t2 и до конца.
Обратите внимание:
1) для транзакции A установлен уровень изоляции READ UNCOMMITTED;
2) транзакцией A прочитаны незафиксированные изменения строк таблиц FACULTY и PULPIT.
Сценарии на рис. 13.51 и 13.52 демонстрируют неповторяющееся чтение (рис. 13.47) в транзакции с уровнем изолированности READ COMMITTED.
Рис. 13.51. Неповторяющееся чтение: транзакция A
Рис. 13.52. Неповторяющееся чтение: транзакция В
Обратите внимание:
1) для транзакции A установлен уровень изоляции READ COMMITTED;
2) при повторном чтении в транзакции A (второй оператор SELECT) прочитаны зафиксированные изменения строк таблицы PULPIT.
Сценарии на рис. 13.53 и 13.54 демонстрируют фантомное чтение (рис. 13.48) в транзакции с уровнем изолированности READ REAPETABLE.
Рис. 13.53. Фантомное чтение: транзакция А
Рис. 13.54. Фантомное чтение: транзакция В
Обратите внимание:
1) для транзакции A установлен уровень изоляции REPEATABLE READ;
2) при повторном чтении в транзакции A (второй оператор SELECT) прочитаны добавленная и зафиксированная строка таблицы TEACHER.
Дата: 2019-02-25, просмотров: 268.