Middle+
53
questionbank

Какие аномалии могут возникать при выполнении параллельных транзакций?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

При параллельном выполнении транзакций могут возникать следующие аномалии:

  1. Потерянное обновление (Lost Update): Одна транзакция перезаписывает изменения другой транзакции до того, как эти изменения были зафиксированы.

    ВремяТранзакция 1Транзакция 2
    t1Читает значение Валанс (например, 100)
    t2Читает значение Валанс (например, 100)
    t3Увеличивает Валанс на 10 (Валанс = 110)
    t4Увеличивает Валанс на 20 (Валанс = 120)
    t5Фиксирует изменения (Валанс становится 110)
    t6Фиксирует изменения (Валанс становится 120)

    Результат: Несмотря на два увеличения, конечное значение Валанс равно 120, а не 130. Увеличение от Транзакции 1 потеряно.

  2. Грязное чтение (Dirty Read): Одна транзакция читает незафиксированные изменения другой транзакции. Если транзакция, сделавшая изменения, откатится, прочитанные данные окажутся недействительными.

    ВремяТранзакция 1Транзакция 2
    t1Начинает изменение Валанс (100 -> 110)
    t2Читает Валанс (получает 110)
    t3Откатывает изменение (Валанс возвращается к 100)
    t4Использует Валанс = 110 в расчетах, хотя фактическое значение 100

    Результат: Транзакция 2 основывает свои действия на данных, которые в конечном итоге не были зафиксированы.

  3. Неповторяющееся чтение (Non-Repeatable Read): В течение одной транзакции при повторном чтении одной и той же строки получаются разные значения, потому что другая транзакция зафиксировала изменения этой строки между чтениями.

    ВремяТранзакция 1Транзакция 2
    t1Читает Валанс (получает 100)
    t2Изменяет Валанс на 110 и фиксирует
    t3Снова читает Валанс (получает 110 вместо ожидаемых 100)

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

  4. Фантомное чтение (Phantom Read): Похоже на неповторяющееся чтение, но касается не изменения существующих строк, а добавления или удаления строк, которые влияют на результаты запроса с предикатом.

    ВремяТранзакция 1Транзакция 2
    t1Выполняет запрос SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (получает 5)
    t2Добавляет новую заявку со статусом 'Pending' и фиксирует
    t3Снова выполняет SELECT COUNT(*) FROM Orders WHERE Status = 'Pending' (получает 6)

    Результат: При повторном выполнении запроса появляются "фантомные" строки, которых не было при первом чтении.

Эти аномалии предотвращаются использованием различных уровней изоляции транзакций.