Распределение данных по разным базам данных из
Delphi
Иногда возникает необходимость синхронно изменять данные одновременно в
двух или более базах данных, которые кроме того могут находиться на разных
серверах InterBase. Для этого в InterBase можно использовать распределенные
транзакции на основе Two-Phase Commit (2PC). Однако такие транзакции доступны
только посредством функций InterBase API, но не через BDE-SQL Link.
Решить подобную задачу из Delphi можно следующим образом:
Представим себе, что у нас есть две базы данных - D1 и D2. В них обоих
есть таблицы с одинаковым именем T1 (поэтому для уточнения будем упоминать
их как D1.T1 и D2.T1).
-
Создайте в базе данных D1 таблицу T2 со структурой, аналогичной Т1.
-
На операцию вставки в таблицу T1 создайте триггер, который будет "переносить"
созданную запись в таблицу T2 и генерировать событие. Например
CREATE TRIGGER TAD_T1 FOR T1
ACTIVE AFTER INSERT
AS
BEGIN
INSERT INTO T2 VALUES (FIELD1, FIELD2, FIELD3, ...);
POST_EVENT "INSERT INTO T1";
END
- Напишите приложение, которое будет иметь два компонента TDatabase, подсоедененные
соответственно к базам данных D1 и D2. Это приложение должно зарегистрироватьс
на событие вставки записи в таблицу D1.T1 (в примере это событие "INSERT INTO
T1". Приложение по появлению события (а это означает подтвержденную вставку
записи в таблицу D1.T1) должно делать следующее:
- Стартовать транзакцию RepeatableRead для TDatabase, подсоедененного к
базе данных D1
- Стартовать транзакцию (либо ReadCommitted либо RepeatableRead) для TDatabase,
подсоедененного к D2
-
Открыть таблицу D1.T2 либо компонентом TTable либо TQuery (с запросом "select
* from T2")
- Скопировать все данные из таблицы D1.T2 в D2.T1. Сделать это можно либо
компонентом TBatchMove (режим batAppend), либо самостоятельно написав процедуру
копирования записей в цикле.
-
После копирования сделать COMMIT для базы данных D2.
-
Удалить все записи в D1.T2 и сделать COMMIT для D1. Безусловно, если
предыдущая операция (D2.commit) не прошла, то и удалять записи не нужно.
Заметьте, что события посылаются приложению на каждую вставку записи в таблицу
D1.T1, поэтому приложение, копирующее данные из D1 в D2, может получить сразу
"пакет" уведомлений . Это не является проблемой, т.к. будет скопирована не одна
запись за одну операцию, а несколько, но все они гарантированно окажутся в базе
данных D2.
(с) 1997 Epsylon Technologies