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