Кэширование памяти

Управление транзакциями

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

Для поддержания целостности БД используется так называемый механизм транзакций. Транзакция представляет собой последовательность операций, обычно выполняемую для нескольких наборов данных. Транзакция переводит БД из одного целостного состояния в другое.

Транзакция может быть явной или неявной. Неявная транзакция запускается автоматически при модификации набора данных, например, при выполнении методов Edit, Insert, Delete. Неявная транзакция утверждается методом Post закрепления изменений в наборе данных, а отменяется методом Cancel.

Явная транзакция означает, что программист должен самостоятельно организовывать операции изменения наборов данных. Для реализации механизма явных транзакций предоставляются специальные методы компонента Database:

- StartTransaction – начинает транзакцию, после него должны располагаться инструкции, составляющие транзакцию,

- Commit – подтверждает транзакцию и все изменения вступают в силу,

- Rollback – отменяет транзакцию и действие всех операций в рамках этой транзакции при возникновении исключений.

При модификации удаленной БД также осуществляются явные и неявные транзакции.

Возможность явного управления транзакциями представляет язык SQL сервера, в составе которого есть следующие инструкции:

SET TRANSACTION – начать транзакцию,

COMMIT – подтвердить транзакцию,

ROLLBACK – откатить транзакцию.


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

Чтобы включить для набора данных режим кэшированных изменений необходимо установить значение True у свойства CachedUpdates набора данных Table или Query.

Для реализации механизма кэшированных изменений используются соответствующие методы компонента Database:

- ApplyUpdates – записывает в БД изменения в кэшированных данных, при этом результаты выполнения всех операций редактирования, вставки или удаления записей пересылаются одним пакетом, что может значительно снизить нагрузку на сеть,

- CommitUpdates – подтверждает изменения,

- CancelUpdates – отменяет изменения, возвращая БД в исходное состояние.

Для анализа результата выполнения записи изменений в БД используется конструкция TRY…EXCEPT.

Пример:

procedure TForm1.Button1Click (Sender: TObject);

begin

Database1.StartTransaction;

TRY

Query1.ApplyUpdates;

Database1.Commit;

Query1.CommitUpdates;

EXCEPT

MessageDlg ('Изменения не сохранены!', mtError, [mbOK],0);

Query1.CancelUpdates;

end;

end;

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

Использование компонента UpdateSQL

Компонент UpdateSQL предназначен для подтверждения кэшированных изменений в наборе данных Query.

Набор данных Query связывается с компонентом UpdateSQL через свое свойство UpdateObject, в качестве значения которого выбирается имя компонента UpdateSQL. Кроме того, для набора данных Query нужно установить в значение True свойства CachedUpdates и RequestLive.

Роль компонента UpdateSQL заключается в выполнении SQL-запросов, обновляющих необходимые записи связанного с ним набора данных Query. При этом данный компонент позволяет одновременно хранить и выполнять три разных запроса: на редактирование, на вставку и на удаление записей. Указанные запросы содержатся в свойствах ModifySQL, InsertSQL и DeleteSQL.

Ввести тексты соответствующих запросов можно вручную и с помощью Редактора свойств компонента UpdateSQL, который вызывается командой UpdateSQL Editor контекстного меню компонента или двойным щелчком на компоненте UpdateSQL.

Редактор UpdateSQL Editor содержи две вкладки, первоначально выбрана вкладка параметров Options. В списке Table Name выбирается таблица, для записей которой включен механизм кэшированных изменений. Список содержит имена таблиц, указанных в запросе набора данных Query.

После выбора таблицы в списке ключевых полей (Key Fields) нужно выделить столбцы, входящие в состав индекса и используемые при доступе к данным, а в списке обновляемых полей (Update Fields) – столбцы, значения которых будут обновляться.

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

Запросы компонента UpdateSQL можно выполнять либо через вызов методов компонента Database, либо через метод самого компонента UpdateSQL. При подтверждении кэшированных изменений методом ApplyUpdates компонента Database для указанных наборов данных Query автоматически обрабатываются запросы соответствующего компонента UpdateSQL.

Пример:

Database1.ApplyUpdates ([Query1]);

Подтверждение кэшированных изменений также можно выполнить последовательным вызовом методов:

- SetParams (UpdateKind) – устанавливает для изменяемой записи значения параметров соответствующего SQL-запроса,

- ExecSQL (UpdateKind) – выполняет указанный запрос.

Параметр UpdateKind определяет вид изменения записи:

- ukModify – редактирование,

- ukInsert – вставка,

- ukDelete – удаление.

Так как эти методы работают с текущей записью, они должны вызываться для каждой измененной записи набора данных. Поэтому вызов методов подтверждения выполняют в обработчике OnUpdateRecord.

Пример использования компонента UpdateSQL:

procedure TForm1.Query1UpdateRecord (DataSet; UpdateKind; VAR UpdateAction);

begin

UpdateSQL1.SetParams (UpdateKind);

UpdateSQL1.ExecSQL (UpdateKind);

UpdateAction:= uaApplied;

end;

Параметр UpdateAction устанавливается в значение uaApplied, что соответствует подтверждению изменений в записях.

Последовательный вызов методов SetParams и ExecSQL можно заменить вызовом метода Apply, объединяющего их функциональность.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: