Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Неделя 09 Лекция 2 (14).doc
Скачиваний:
2
Добавлен:
13.11.2019
Размер:
93.7 Кб
Скачать

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-операторов в текст программы аварийное окончание ее работы автоматически вызовет отказ последней запущенной этой программой транзакции.