- •Содержание
- •Лабораторная №1 Проектирование структуры базы данных. Нормализация таблиц.
- •Лабораторная №2 Создание серверной части приложения: алиас, файл базы данных, таблицы.
- •Лабораторная работа №3 Визуальное проектирование структуры базы данных.
- •Лабораторная работа № 4 Отображение данных на клиенте.
- •Лабораторная №5 Добавление/редактирование/удаление данных.
- •Лабораторная работа №6 Создание генераторов и триггеров. Каскадные воздействия.
- •Лабораторная №7 Создание и использование хранимых процедур в ibExpert.
- •Лабораторная №8 Сортировка данных. Поиск. Фильтрация.
- •Лабораторная №9 Работа с транзакциями. Кэширование изменений.
- •Лабораторная №10 Обеспечение достоверности данных, исключительные ситуации.
- •Лабораторная №11 Работа с отчетами.
- •Лабораторная №12 Установление привилегий доступа.
Лабораторная №9 Работа с транзакциями. Кэширование изменений.
Цель работы: научится создавать кэш и управлять им; грамотно использовать свойства, события и методы компонентов для работы с транзакциями и кэшем; научится создавать транзакции и управлять ими.
Реализация механизма транзакций
Механизм транзакций используется для поддержания целостности БД: транзакция переводит БД из одного целостного состояния в другое. Транзакция может быть явной и неявной. Неявная транзакция запускается и завершается автоматически, явной транзакцией управляет программист. Для модификации данных в удаленной базе может использоваться SQL-запрос, выполняемый с помощью метода ExecSQL компонента Query. Такой запрос называют PassThrough SQL, его выполнение приводит к запуску неявной транзакции. Способ взаимодействия с сервером на уровне такой транзакции определяет параметр sqlpassthru mode псевдонима БД или драйвера InterBase, который может принимать следующие значения:
shared autocommit — операторами модификации БД, например, update или insert, автоматически запускается неявная транзакция (по умолчанию); после внесения изменений эта транзакция автоматически подтверждается; разные транзакции могут использовать общее соединение с БД;
shared no autocommit — операторами модификации БД также автоматически запускается неявная транзакция, но автоматического ее подтверждения не происходит, и нужно самостоятельно выполнять оператор commit; разные транзакции могут использовать общее соединение с БД;
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;