Введение в стандарты языка баз данных SQL



         

Транзакции, подключения к базе данных, сессии - часть 2


  • P1 ("Dirtyread" - "Грязное чтение"): Транзакция T1 модифицирует строку. Затем транзакция T2 читает эту строку до того, как T1 выполняет COMMIT. Если после этого T1 выполнит ROLLBACK, то окажется, что T2 прочитала строку, которая никогда не была зафиксирована; можно считать, что эта строка никогда не существовала.
  • P2 ("Non-repeatableread" - "Неповторяющееся чтение"): Транзакция T1 читает строку. Затем транзакция T2 модифицирует или удаляет эту строку и выполняет COMMIT. Если после этого T1 попытается повторно прочитать эту строку, то либо получит ее измененное состояние, либо обнаружит, что строка удалена.
  • P3 ("Phantom" - "Фантом"): Транзакция T1 читает набор строк N, которые удовлетворяют некоторому условию поиска. Затем транзакция T2 выполняет операторы SQL, которые генерируют одну или более строк, удовлетворяющих условию поиска, использованному T1. Если после этого транзакция T1 повторит чтение с тем же самым условием поиска, она получит другой набор строк.
  • Все четыре уровня изоляции гарантируют, что каждая SQL-транзакция либо выполнится полностью, либо не выполнится совсем и что ни одно изменение не будет потеряно. Уровни изоляции различаются по отношению к явлениям P1, P2 и P3. В приводимой ниже таблице показано, какие явления возможны, а какие невозможны на данном уровне изоляции.

    Уровень изоляцииP1P2P3
    READUNCOMMITTEDВозможноВозможноВозможно
    READCOMMITTEDНевозможноВозможноВозможно
    REPEATABLEREADВозможноНевозможноВозможно
    SERIALIZABLEНевозможноНевозможноНевозможно

    Замечание: отсутствие рассмотренных выше явлений при выполнении транзакций на уровне изоляции SERIALIZABLE является следствием требования, что такие транзакции являются сериализуемыми.

    Изменения данных и/или схем, произведенные транзакцией, не завершившей выполнение оператором COMMIT, могут быть восприняты этой транзакцией в той же самой SQL-сессии. Кроме того, изменения будут видны другим транзакциям и этой транзакции в других сессиях на уровне изоляции READUNCOMMITTED, но не будут видны другим транзакциям на уровне изоляции READCOMMITTED, REPEATABLEREAD, или SERIALIZABLE.

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

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




      Содержание  Назад  Вперед