24. Проблемы конкурирующих транзакций и методы их решения. Уровни изоляции транзакций
Проблемы конкурирующих транзакций
Проблема потерянного обновления
Несколько транзакций меняют один и тот же кортеж, в результате сохраится только резльтат внесения изменений последенй транзакции.
Кладём и списываем деньги со всёта
Проблема грязного чтения
При чтении одной транзакции кортежа, который уже изменён, но ещё не сохранён другой уже завершившейся транзакцией, которая будет потом отменена.
Кладём и списываем деньги со счёта, после этого пытаемся отменить пополнение
Проблема неповторяемого чтения
При повторном чтении данных, уже считанных ранее, транзакция обнаруживает модификацию, вызванную другой завершённой транзакции.
Проблема фантомного чтения
При повторной выборке, выполняющий некоторый запрос, могут попасть новые кортежи
Сначала считываем данные, потом добавляем новую запись и на основе считанных данных получаем неверный результат (например, среднее значение в параллельных подзапросах)
Блокировки
Все транзакции строятся на основе блокировок - блокировки кортежей, аттрибутов, таблиц или всей базы данных
Классификация блокировок
Явные (накладывающиеся пользователем)
Неявные (накладывающиеся самой СУБД)
Монопольные - блокируются все виды доступа к объектам
Коллективные - блокируются доступ к чтению? к объектам
Дедлоки
Если одна из транзакций пытается наложить блокировку, пересекающиеся с какой-то другой блокировкой - появление дедлоков
Уровни изоляции (для решения конкурирующих транзакций)
Незавершённое чтение
Требует, чтобы изменять данные могла только одна транзакция. Поможет справиться с проблемой потерянного обновления.
Завершённое чтение
Если транзакция начала изменение данных, то никакая другая транзакция не сможет их прочитать до завершения первой. Поможет справитсья с проблемой грязного чтения.
Воспроизводимое чтение
Если транзакция считывает данные, то никакая другая транзакция не сможет их изменить до завершения первой. Видимо, поможет справиться с проблемой неповторяемого чтения
Сериализуемость
Если транзакция обращается к данным, то никакая другая транзакция не сможет добавить новые или изменить существующие кортежи в этом объекте данных. Видимо, поможет справиться с проблемой фантомного чтения
Долговечность
Обеспечивается журналируемостью транзакций