Шрифт:
ГЛАВА 26. Конфигурирование транзакций.
Транзакция является "оберткой" вокруг любого фрагмента работы, влияющего на состояние базы данных или более чем одной базы данных. Пользовательский процесс запускает транзакцию и тот же самый пользовательский процесс завершает ее. Поскольку пользовательские процессы могут иметь различные вид и размер, любая транзакция является конфигурируемой. Обязательные и дополнительные свойства транзакции являются важной частью любого контекста транзакции.
Параллельность
Термин параллельность (concurrency) относится к тому состоянию, в котором две или более задач выполняются внутри одной и той же базы данных в одно и то же время. О базе данных при этих условиях говорят, что она поддерживает параллельные задачи. Процесс, владеющий транзакцией, внутри этой транзакции способен выполнять любые операции, которые:
* будут согласованными в текущем представлении базы данных;
* при подтверждении не будут влиять на согласованность любых других текущих представлений базы данных для активных транзакций.
Каждая транзакция конфигурируется с помощью группы параметров, которые позволяют клиентскому процессу абсолютно точно прогнозировать поведение сервера базы данных, когда он обнаружит потенциальную несогласованность. Интерпретация сервером понятия "согласованности" управляется конфигурацией транзакции. Конфигурация, в свою очередь, управляется клиентским приложением.
Факторы, влияющие на параллельность
Четырьмя параметрами конфигурации, влияющими на параллельность, являются:
* уровень изоляции;
* способ разрешения блокировок;
* способ доступа;
* резервирование таблиц.
На одном из уровней изоляции (READ COMMITTED) также рассматриваются текущие состояния версий записей.
Уровень изоляции
Firebird предоставляет три уровня изоляции транзакций для определения "глубины" согласованности требований транзакции. В одном крайнем случае транзакция может получить исключительный доступ по записи ко всей таблице, в то время как в другом крайнем случае неподтвержденная транзакция получает доступ к любым внешним изменениям состояния базы данных. Никакая транзакция в Firebird не сможет видеть неподтвержденные изменения данных от других транзакций.
В Firebird уровень изоляции может быть:
* READ COMMITTED:
• RECORD_VERSION;
• NO RECORD_VERSION;
* SNAPSHOT;
* SNAPSHOT TABLE STABILITY.
Стандарт SQL по изоляции транзакций "симпатизирует" механизму двухфазной блокировки, которую использует большинство реляционных СУБД для реализации изоляции. Это является его отличительной чертой по сравнению с большинством других стандартов. Он определяет изоляцию не столько в теоретических терминах, сколько в терминах феноменов, допускаемых каждым уровнем (или запрещаемых им). Феноменами, с которыми имеет дело стандарт, являются:
* "грязное" чтение (Dirty read): появляется, если транзакция способна читать неподтвержденные (ожидающие завершения) изменения, выполненные другими транзакциями;
* неповторяемое чтение (Non-repeatable read): появляется, если последующие чтения набора строк в рамках этой же транзакции могут отличаться от того, что было прочитано транзакцией в начале ее работы;
* фантомные строки (Phantom rows): появляется, если последующий набор строк, прочитанный транзакцией, отличается от набора, который был прочитан в начале работы транзакции. Фантомные явления появляются, если при последующем чтении появляются новые добавленные строки и/или исчезают удаленные строки, которые были подтверждены с момента первого чтения.
В табл. 26.1 показаны определяемые в стандарте четыре уровня изоляции с явлениями, которые управляют их определениями.
READ UNCOMMITTED вовсе не поддерживается в Firebird, READ COMMITTED соответствует стандарту. На двух следующих уровнях этого уровня изоляции природа многоверсионной архитектуры превалирует над ограничениями двухфазной блокировки, предлагаемой стандартом. Отображение указанных в стандарте уровней REPEATABLE READ и SERIALIZABLE невозможно.
Таблица 26.1. Уровни изоляции и управление феноменами в стандарте SQL
Уровень изоляции | "Грязное"чтение | Неповторяемое чтение | Фантомы |
READ UNCOMMITTED | Допустимо | Допустимо | Допустимо |
READ COMMITTED | Недопустимо | Допустимо | Допустимо |
REPEATABLE READ | Недопустимо | Недопустимо | Допустимо |
SERIALIZABLE | Недопустимо | Недопустимо | Недопустимо |