Неповторяемое считывание
Транзакция A дважды читает одну и ту же строку. Между этими чтениями вклинивается транзакция B, которая изменяет значения в строке.
Чтение ![]() |
![]() |
--- |
--- | ![]() |
Чтение ![]() |
--- | ![]() |
Запись ![]() |
--- | ![]() |
Фиксация транзакции |
Повторное чтение ![]() |
![]() |
--- |
Фиксация транзакции | ![]() |
--- |
Транзакция A ничего не знает о существовании транзакции B, и, т.к. сама она не меняет значение в строке, то ожидает, что после повторного чтения значение будет тем же самым.
Результат. Транзакция A работает с данными, которые, с точки зрения транзакции A, самопроизвольно изменяются.
Транзакция A дважды читает одну и ту же строку. Между этими чтениями вклинивается транзакция B, которая изменяет значения в строке.
S-блокировка ![]() |
![]() |
--- |
Чтение ![]() |
![]() |
--- |
--- | ![]() |
X-блокировка ![]() |
--- | ![]() |
Ожидание… |
Повторное чтение ![]() |
![]() |
Ожидание… |
Фиксация транзакции (Блокировка снимается) |
![]() |
Ожидание… |
--- | ![]() |
X-блокировка ![]() |
--- | ![]() |
Запись ![]() |
--- | ![]() |
Фиксация транзакции
|
Результат. Транзакция B притормозилась до окончания транзакции A. В результате транзакция A дважды читает одни и те же данные правильно. После окончания транзакции A, транзакция B продолжила работу в обычном режиме.