Получение разных данных о разных соединениях по событию AFTER UPDATE

Я запускаю несколько параллельных процессов, каждый из которых имеет открытое соединение с базой данных 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 данные, прежде чем обновление было выполнено!

Любое предложение почему?

2

Решение

Обычно, когда вы видите старые данные, вы используете транзакцию с моментальным снимком уровня изоляции (он же параллелизм), которая была запущена до того, как было зафиксировано изменение данных.

Необходимо убедиться, что когда процесс C запрашивает данные в ответ на уведомление, он завершает (фиксирует) старую транзакцию и запускает новую транзакцию для получения обновленных данных.

Альтернативой является использование транзакции с фиксированным уровнем чтения, но это может иметь свои недостатки в зависимости от того, что делает ваше приложение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]