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

       

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


SQL-агентом называется зависимый от реализации объект, вызывающий выполнение операторов SQL. Под SQL-транзакцией (иногда называемой просто транзакцией) понимается последовательность выполнения операторов SQL, являющаяся атомарной по отношению к восстановлению. Эти операции выполняются одной или более единицами компиляции и модулями или путем прямого вызова SQL. От реализации зависит, могут ли в одной транзакции выполняться динамические и/или статические операторы выборки и манипулирования данными и динамические и/или статические операторы определения и манипулирования схемой. Если такие сочетания допускаются, то поведение открытого курсора, подготовленного динамического оператора, отложенного ограничения определяются в реализации.

Каждый модуль или прямой вызов SQL, инициирующие выполнение оператора, ассоциируются с транзакцией. SQL-транзакция начинается при выполнении процедуры из некоторого модуля или прямого вызова оператора SQL вне активной транзакции. Транзакция завершается при выполнении операторов COMMIT или ROLLBACK. Если SQL-транзакция завершается успешным выполнением оператора COMMIT, то все изменения, произведенные ею над данными и/или схемой становятся постоянно хранимыми и доступными всем параллельно выполняющимся или образуемым впоследствии транзакциям. Если транзакция завершается оператором ROLLBACK или если выполнение оператора COMMIT оказывается неуспешным, то все изменения, произведенные транзакцией над данными и/или схемой, ликвидируются. Если выполнение оператора COMMIT было начато, но при этом возникли определенные исключительные условия, то неизвестно, зафиксированы или уничтожены результаты этой транзакции.

У каждой SQL-транзакции имеется режим доступа - "только чтение" или "чтение и запись". Режим доступа может быть явно установлен оператором SETTRANSACTION; по умолчанию он устанавливается в "чтение-запись". Термин "только чтение" применяется только к постоянно хранимым базовым и представляемым таблицам.

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

Транзакции, инициированные разными SQL-агентами, которые обращаются к одним и тем же данным и/или схемам, являются конкурирующими (concurrent; по-русски обычно такие транзакции называют "параллельно" выполняющимися).

Каждой SQL-транзакции приписывается некоторый уровень изоляции: READUNCOMMITTED, READCOMMITTED, REPEATABLEREAD или SERIALIZABLE. Уровень изоляции транзакции определяет степень, в которой на операции этой транзакции влияют операции параллельно выполняющихся транзакций и в которой операции данной транзакции влияют на операции других транзакций. Уровень изоляции может быть явно установлен оператором SETTRANSACTION. По умолчанию устанавливается уровень изоляции SERIALIZABLE. При выполнении конкурирующих транзакций на этом уровне изоляции гарантируется их сериализуемость. Сериализованное выполнение - это такое выполнение операций конкурирующих транзакций, которое производит тот же самый окончательный эффект, что и некоторое последовательное выполнение этих транзакций (т.е. такое выполнение, при котором каждая транзакция полностью завершается до начала следующей). Уровень изоляции определяет вид явления, которое может произойти при параллельном выполнении транзакций. Возможны следующие виды явлений:


  1. P1 ("Dirtyread" - "Грязное чтение"): Транзакция T1 модифицирует строку. Затем транзакция T2 читает эту строку до того, как T1 выполняет COMMIT. Если после этого T1 выполнит ROLLBACK, то окажется, что T2 прочитала строку, которая никогда не была зафиксирована; можно считать, что эта строка никогда не существовала.
  2. P2 ("Non-repeatableread" - "Неповторяющееся чтение"): Транзакция T1 читает строку. Затем транзакция T2 модифицирует или удаляет эту строку и выполняет COMMIT. Если после этого T1 попытается повторно прочитать эту строку, то либо получит ее измененное состояние, либо обнаружит, что строка удалена.
  3. 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 может быть также инициировано реализацией при распознавании невосстановимых ошибок. В этих случаях генерируется соответствующее исключительное условие.

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




  1. изменения данных или схем произведены явно самой транзакцией;
  2. при повторном чтении процедуре передаются другие значения параметров;
  3. используются изменяемые во времени переменные, такие как CURRENT_DATEandCURRENT_USER.


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

SQL-соединение активно, если какой-либо оператор SQL, инициировавший или востребоваший SQL-транзакцию, был выполнен на соответствующем сервере в течение текущей транзакции. Соединение может быть текущим или потенциальным. Если соединение, установленное самым последним по времени выполнения явным или неявным оператором CONNECT (или SETCONNECTION), не разорвано, то это соединение является текущим; в противном случае оно не текущее. Существующее соединение, не являющееся текущим, называется потенциальным.

Реализация может обнаружить потерю текущего соединения при выполнении любого оператора SQL. Когда это происходит, генерируется исключительное условие, смысл которого состоит в том, что результаты действий, выполненных сервером в связи с этим оператором, неизвестны SQL-агенту.

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

Пользователь может инициировать установление соединения между SQL-клиентом, связанным с SQL-агентом, и конкретным SQL-сервером путем выполнения оператора CONNECT. Иначе установление соединения между клиентом и сервером инициируется, когда вызывается процедура и отсутствует текущее соединение. Возможно определяемое в реализации соединение по умолчанию с некоторым выделенным SQL-сервером.

SQL-соединение уничтожается либо при выполнении оператора DISCONNECT, либо после последнего вызова процедуры в последнем активном модуле, либо после последнего выполнения прямого вызова оператора SQL. Механизм и правила, по которым среда SQL определяет, что вызов процедуры или прямой вызов оператора SQL являются последними, определяются в реализации.

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

SQL-сессия накрывает выполнение последовательности операторов SQL, вызываемых одним пользователем через единственного SQL-агента или с помощью механизма прямого вызова. Сессия ассоциируется с соединением. SQL-сессия, ассоциированная с соединением по умолчанию, называется сессией по умолчанию. Сессия может быть текущей или потенциальной. Текущая сессия - это сессия, ассоциированная с текущим соединением (соответствующим образом определяется потенциальная сессия).

SQL-сессии соответствует модуль сессии, который отличается от любого другого модуля, одновременно существующего в среде SQL. Модуль сессии содержит глобальные подготовленные операторы SQL, относящиеся к этой сессии.


Содержание раздела