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