Я запускаю несколько параллельных процессов, каждый из которых имеет открытое соединение с базой данных firebirdSQL. Один процесс поймает событие обновления, опубликованное firebird:
SET TERM ^ ;
CREATE TRIGGER CM_ARTIKEL_AU FOR ARTIKEL
ACTIVE AFTER UPDATE
POSITION 0
AS
BEGIN
/* Trigger body */
Insert into CM_ARTIKEL_CHANGES(
"TYPE",
ARTNR
)
values (
'UPDATE',
old.ARTIKELNR
);
POST_EVENT 'UPDATE_ARTICLE';
END^
SET TERM ; ^
Сценарий:
Процесс поймать AFTER_UPDATE
событие и информирует через процесс rabbitMQ В а также С о наборе данных для проверки.
Процесс В выполнить select
заявление и получает обновленные данные. Все отлично.
Процесс С выполнить select
заявление и получает OLD данные, прежде чем обновление было выполнено!
Любое предложение почему?
Обычно, когда вы видите старые данные, вы используете транзакцию с моментальным снимком уровня изоляции (он же параллелизм), которая была запущена до того, как было зафиксировано изменение данных.
Необходимо убедиться, что когда процесс C запрашивает данные в ответ на уведомление, он завершает (фиксирует) старую транзакцию и запускает новую транзакцию для получения обновленных данных.
Альтернативой является использование транзакции с фиксированным уровнем чтения, но это может иметь свои недостатки в зависимости от того, что делает ваше приложение.
Других решений пока нет …