Собственно несовместимый анализ
Эффект собственно несовместимого анализа также отличается от предыдущих примеров тем, что в смеси присутствуют две транзакции - одна длинная, другая короткая.
Длинная транзакция выполняет некоторый анализ по всей таблице, например, подсчитывает общую сумму денег на счетах клиентов банка для главного бухгалтера. Пусть на всех счетах находятся одинаковые суммы, например, по $100. Короткая транзакция в этот момент выполняет перевод $50 с одного счета на другой так, что общая сумма по всем счетам не меняется.
Чтение счета ![]() ![]() |
![]() |
--- |
--- | ![]() |
Снятие денег со счета ![]() ![]() |
--- | ![]() |
Помещение денег на счет ![]() ![]() |
--- | ![]() |
Фиксация транзакции |
Чтение счета ![]() ![]() |
![]() |
--- |
Чтение счета ![]() ![]() |
![]() |
--- |
Фиксация транзакции | ![]() |
--- |
Результат. Хотя транзакция B все сделала правильно - деньги переведены без потери, но в результате транзакция A подсчитала неверную общую сумму.
Т.к. транзакции по переводу денег идут обычно непрерывно, то в данной ситуации следует ожидать, что главный бухгалтер никогда не узнает, сколько же денег в банке.
Длинная транзакция выполняет некоторый анализ по всей таблице, например, подсчитывает общую сумму денег на счетах клиентов банка для главного бухгалтера. Пусть на всех счетах находятся одинаковые суммы, например, по $100. Короткая транзакция в этот момент выполняет перевод $50 с одного счета на другой так, что общая сумма по всем счетам не меняется.
S-блокировка счета ![]() |
![]() |
--- |
Чтение счета ![]() ![]() |
![]() |
--- |
--- | ![]() |
X-блокировка счета ![]() |
--- | ![]() |
Снятие денег со счета ![]() ![]() |
--- | ![]() |
X-блокировка счета ![]() |
--- | ![]() |
Ожидание… |
S-блокировка счета ![]() |
![]() |
Ожидание… |
Чтение счета ![]() ![]() |
![]() |
Ожидание… |
S-блокировка счета ![]() |
![]() |
Ожидание… |
Ожидание… | ![]() |
Ожидание… |
Результат. Обе транзакции ожидают друг друга и не могут продолжаться. Возникла ситуация тупика.