Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
все лабы по рубд на ibexpert.doc
Скачиваний:
13
Добавлен:
13.08.2019
Размер:
905.22 Кб
Скачать

Лабораторная №9 Работа с транзакциями. Кэширование изменений.

Цель работы: научится создавать кэш и управлять им; грамотно использовать свойства, события и методы компонентов для работы с транзакциями и кэшем; научится создавать транзакции и управлять ими.

  • Реализация механизма транзакций

Механизм транзакций используется для поддержания целостности БД: транзакция переводит БД из одного целостного состояния в другое. Транзакция может быть явной и неявной. Неявная транзакция запускается и завершается автоматически, явной транзакцией управляет программист. Для модификации данных в удаленной базе может использоваться SQL-запрос, выполняемый с помощью метода ExecSQL компонента Query. Такой запрос называют PassThrough SQL, его выполнение приводит к запуску неявной транзакции. Способ взаимодействия с сервером на уровне такой транзакции определяет параметр sqlpassthru mode псевдонима БД или драйвера InterBase, который может принимать следующие значения:

  1. shared autocommit — операторами модификации БД, например, update или insert, автоматически запускается неявная транзакция (по умолчанию); после внесения изменений эта транзакция автоматически подтверждается; разные транзакции могут использовать общее соединение с БД;

  2. shared no autocommit — операторами модификации БД также автоматически запускается неявная транзакция, но автоматического ее подтверждения не происходит, и нужно самостоятельно выполнять оператор commit; разные транзакции могут использовать общее соединение с БД;

  3. not shared — транзакции должны использовать различные соединения с БД и подтверждаться выполнением оператора commit. Возможность явного управления транзакциями предоставляет язык SQL сервера, который имеет в своем составе следующие операторы:

  • set transaction — начать транзакцию;

  • commit — подтвердить транзакцию;

  • rollback — отменить транзакцию.

Оператор запуска явной транзакции имеет формат:

SET TRANSACTION

[READ WRITE | READ ONLY]

[WAIT | NO WAIT]

[[ISOLATION LEVEL]

{SNAPSHOT [TABLE STABILITY] | READ COMMITED}]

[RESERVING <Список таблиц>

[FOR [{SHARED | PROTECTED}]

[{READ | WRITE}]];

Все операнды этого оператора являются необязательными и позволяют управлять перечисленными ниже режимами транзакции. Режим доступа к данным:

read write — разрешены чтение и модификация записей (по умолчанию);

read only — разрешено только чтение записей.

Поведение в случае конфликта транзакций при обновлении записей:

wait — ожидание завершения другой транзакции (по умолчанию);

no wait — прекращение данной транзакции.

Уровень изоляции от других транзакций (операнд isolation level):

snapshot — чтение данных в состоянии на момент начала транзакции (по умолчанию); изменения, сделанные другими транзакциями, в данной транзакции не видны;

snapshot table stability — предоставление транзакции исключительного доступа к таблицам; другие транзакции могут читать записи из таблиц;

read commited — чтение только подтвержденных изменений в записях; если изменения еще не подтверждены, то читается предыдущая версия записи.

Блокирование таблиц, указанных в списке операнда reserving, для других транзакций:

protected read — разрешено только чтение записей;

protected write — для транзакций с уровнем изоляции snapshot или read committed разрешено только чтение записей;

shared read — разрешены чтение и модификация записей;

shared write — разрешено чтение записей;

Для транзакций с уровнем изоляции snapshot или read committed разрешена модификация записей. Действие операторов commit и rollback по утверждению и отмене транзакции аналогично действию одноименных методов компонента Database.

  • Использование механизма кэшированных изменений

Механизм кэшированных изменений заключается в том, что на компьютере клиента в кэше (буфере) создается локальная копия данных, и все изменения в данных выполняются в этой копии. Для хранения локальной копии используется специальный буфер (кэш). Сделанные изменения можно утвердить, перенеся их в основную БД, хранящуюся на сервере, или отказаться от них. Этот механизм напоминает механизм транзакций, но, в отличие от него, снижает нагрузку на сеть, т. к. все изменения передаются в основную БД одним пакетом. Механизм кэшированных изменений реализуется в приложении, для чего компоненты, в первую очередь Database, Table и Query, имеют соответствующие средства. Кроме того, механизм кэшированных изменений поддерживается предназначенным для этого компонентом UpdateSQL. Основные достоинства рассматриваемого механизма проявляются для удаленных БД, но его можно использовать и при работе с локальными БД.

Пример использования компонента TIBUpdateSQL (с использованием TIBTable и TIBQuery):

Свойство CachedUpdates у TIBTable и TIBQuery следует выставить в значение True. При этом они должны быть неактивными. Затем в TIBQuery в свойстве UpdateObject нужно указать наш TIBUpdateSQL. Затем в TIBQuery прописать запрос, например:

select *

from RENT

where RN > 100;

и активизировать TIBQuery и TIBTable. После этого на какую-нибудь кнопку на форме пропишем код принятия изменений, например:

procedure TForm1.Button3Click(Sender: TObject);

begin

try

IBDatabase1.ApplyUpdates([TRENT, IBQuery1]); // применить обновления

except // если возникла ошибка

MessageBox(Handle, 'Изменения не сохранены', 'Error', MB_ICONERROR);

TRENT.CancelUpdates; // отменить обновления

IBQuery1.CancelUpdates; // отменить обновления

end;

end;