# 24. Проблемы конкурирующих транзакций и методы их решения. Уровни изоляции транзакций

# Проблемы конкурирующих транзакций

  1. Проблема потерянного обновления

    Ситуация, когда при одновременном изменении одного блока данных разными транзакциями одно из изменений теряется

    Несколько транзакций изменяют один и тот же кортеж, в результате сохраняются изменения лишь последней транзакции

    TIP

    Кладём и списываем деньги со счёта

  2. Проблема грязного чтения

    Возникает при чтении одной транзакцией кортежа, который уже изменён, но ещё не сохранён другой транзакцией, которая затем будет отменена.

    TIP

    Кладём и списываем деньги со счёта, после этого пытаемся отменить пополнение

  3. Проблема неповторяемого чтения

    Ситуация, когда при повторном чтении данных в рамках одной транзакции ранее прочитанные данные оказываются изменёнными

  4. Проблема фантомного чтения

    Ситуация, когда при повторном чтении в рамках одной транзакции одна и та же выборка дает разные множества строк.

    При повторном чтении данных транзкация обнаруживает кортежи, добавленные другой транзакцией после предыдущего чтения данных

    TIP

    Сначала считываем данные, потом добавляем новую запись и на основе считанных данных получаем неверный результат (например, среднее значение в параллельных подзапросах)

# Блокировки

TIP

Все транзакции строятся на основе блокировок - блокировки кортежей, атрибутов, таблиц или всей базы данных

# Классификация блокировок

  1. Явные - непосредственно указаны в коде транзакции

  2. Неявные - накладываются СУБД, если определённый алгоритм "понимает", что что-то нужно заблокировать

  3. Монопольные - блокируются все способы взаимодействия с объектом

  4. Коллективные - блокируется только изменение объекта

Дедлоки

TIP

Если одна из транзакций пытается наложить блокировку, пересекающуюся с какой-то другой блокировкой - появление дедлоков

# Уровни изоляции (для решения конкурирующих транзакций)

  1. Незавершённое чтение

    Требует, чтобы изменять данные могла только одна транзакция. Поможет справиться с проблемой потерянного обновления.

  2. Завершённое чтение

    Если транзакция начала изменение данных, то никакая другая транзакция не сможет их прочитать или изменить до завершения первой. Поможет справитсья с проблемой грязного чтения.

  3. Воспроизводимое чтение

    Если транзакция считывает данные, то никакая другая транзакция не сможет их изменить до завершения первой. Видимо, поможет справиться с проблемой неповторяемого чтения

  4. Сериализуемость

    Если транзакция обращается к данным, то никакая другая транзакция не сможет добавить новые строки или изменить существующие, которые могли бы быть считаны при выполнении текущей транзакции. Видимо, поможет справиться с проблемой фантомного чтения

# Долговечность

Обеспечивается журналируемостью транзакций