
- •Содержание
- •14.1. Механизмы отката изменений в базе данных.
- •14.2. Определение понятия ‘транзакция’.
- •14.3. Свойства транзакций.
- •14.4. Уровни изоляции транзакций: приложение клиента.
- •14.4.1. Уровень изоляции транзакции Dirty Read.
- •14.4.2. Уровень изоляции транзакции Read Committed.
- •14.4.3. Уровень изоляции транзакции Repeatable Read.
- •14.4.4. Установка уровня изоляции транзакций в Delphi.
- •14.5. Управление транзакциями на sql-сервере InterBase.
- •Контрольные вопросы:
14.4.3. Уровень изоляции транзакции Repeatable Read.
Чтение данных. Текущая транзакция всегда видит данные в том состоянии, в котором они находились на момент старта транзакции.
Пусть транзакция А открыла набор данных. После этого транзакция В внесла в те же данные изменения и не подтвердила их. Тогда при повторном открытии набора данных транзакция А получит данные в том состоянии, в котором они находились на момент ее старта. Однако "свои" изменения А видеть будет. Пусть транзакция В подтвердила сделанные ею изменения, а транзакция А вновь открыла набор данных. И в этом случае транзакция А получит данные в том состоянии, в котором они находились на момент ее старта.
Изменение данных. Пусть транзакция А внесла изменения в данные и не подтвердила их. Транзакция В после этого также внесла изменения в те же данные. Тогда попытка транзакции В подтвердить внесенные ею изменения будет отвергнута.
14.4.4. Установка уровня изоляции транзакций в Delphi.
Уровень изоляции транзакций определяется свойством компонента TDatabase.
property Translsolation: TTranslsolation;
возможные значения: tiDirtyRead, tiReadCommitted, tiRepeatableRead.
Разные серверы БД различным образом интерпретируют уровни изоляции транзакций, установленные в свойстве Translsolation (таблица 14.1).
Таблица 14.1.
Сервер |
Уровень транзакции |
Интерпретируется как |
Oracle |
tiDirtyRead tiReadCommitted tiRepeatableRead |
tiReadCommitted tiReadCommitted tiRepeatableRead (Только для чтения) |
Sybase, MS-SQL |
tiDirtyRead tiReadCommitted tiRepeatableRead |
tiReadCommitted tiReadCommitted He поддерживается |
DB2 |
tiDirtyRead tiReadCommitted tiRepeatableRead |
tiDirtyRead tiReadCommitted tiRepeatableRead |
Informix |
tiDirtyRead tiReadCommitted tiRepeatableRead |
tiDirtyRead tiReadCommitted tiRepeatableRead |
InterBase |
tiDirtyRead tiReadCommitted tiRepeatableRead |
tiReadCommitted tiReadCommitted tiRepeatableRead |
Paradox, dBASE |
tiDirtyRead tiReadCommitted tiRepeatableRead |
tiDirtyRead Не поддерживается Не поддерживается |
14.5. Управление транзакциями на sql-сервере InterBase.
InterBase управляет транзакциями при помощи SQL-операторов SET TRANSACTION (начать транзакцию), COMMIT (подтвердить транзакцию) и ROLLBACK, (откатить транзакцию).
Оператор SET TRANSACTION имеет формат
SET TRANSACTION [READ WRITE | READ ONLY]
[WAIT | NO WAIT]
[[ISOLATION LEVEL] {SNAPSHOT [TABLE STABILITY]
| READ COMMITTED [[NO] RECORD_VERSION]}]
[RESERVING <список_таблиц> [FOR [SHARKD | PROTECTED] [READ | WRITE]], [<список_таблиц> ...];
где
READ WRITE \ READ ONLY устанавливает уровень доступа к данным (по умолчанию READ WRITE);
WAIT | NO WAIT определяет поведение при возникновении конфликта по обновлению записи данной транзакции с другой транзакцией, ранее сделавшей изменение в той же записи: WAIT (по умолчанию) побуждает данную транзакцию ожидать завершения конкурирующей транзакции; NO WAIT определяет аварийное завершение данной транзакции;
ISOLATION LEVEL определяет уровни изоляции транзакций на сервере (по умолчанию SNAPSHOT);
RESERVING в рамках данной транзакции запирает (lock) таблицы, приведенные в одном или нескольких списках таблиц.
В последнем случае каждому элементу списка таблиц ставятся в соответствие параметры:
PROTECTED READ - конкурирующие транзакции могут читать данные, но не могут изменять;
PROTECTED WRITE - читать данные могут только транзакции с уровнями SNAPSHOT или READ COMMITTED и никакая конкурирующая транзакция не может их изменять.
Стандарт ISO включает определение модели транзакций, построенной на использовании двух специальных операторов — COMMIT и ROLLBACK. Большинство коммерческих реализаций языка SQL, в том числе и InterBase, поддерживает эту модель, которая впервые была реализована в СУБД DB2 компании IBM. В стандарте указывается, что в языке SQL транзакция автоматически запускается любым, инициализирующим транзакцию SQL-оператором, выполняемым пользователем, или программой (например, SELECT, INSERT или UPDATE). Изменения, внесенные в базу данных в ходе выполнения данной транзакции, не будут видны любым другим выполняющимся параллельно транзакциям до тех пор, пока эта транзакция не будет явным образом завершена. Завершение транзакции может быть выполнено одним из следующих четырех способов.
Ввод оператора COMMIT означает успешное завершение транзакции. После его выполнения внесенные в базу данных изменения приобретают постоянный характер. После обработки оператора COMМIT ввод любого инициирующего транзакцию оператора автоматически вызовет запуск новой транзакции.
Ввод оператора ROLLBACK означает отказ от завершения транзакции, в результате чего выполняется откат всех изменений в базе данных, внесенных при выполнении этой транзакции. После обработки оператора ROLLBACK ввод любого инициирующего транзакцию оператора автоматически вызовет запуск новой транзакции.
При внедрении SQL-операторов в текст программы успешное окончание ее работы автоматически вызовет завершение последней запущенной программой транзакции, даже если оператор COMMIT для нее не был введен явно.
При внедрении SQL-операторов в текст программы аварийное окончание ее работы автоматически вызовет отказ последней запущенной этой программой транзакции.