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