我运行几个并行进程,每个进程都与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 ; ^
情境:
处理 A 捕获AFTER_UPDATE
事件,并通过rabbitMQ流程 B 和 C 通知要检查的数据集。
处理 B 执行select
语句并检索更新的数据。一切都很好。
处理 C 执行select
语句并在执行更新之前检索 OLD 数据!
有什么建议吗?
答案 0 :(得分:1)
通常,当您看到旧数据时,您正在使用在提交数据更改之前启动的具有隔离级别快照(也称为并发)的事务。
当进程C查询数据以响应通知时,您需要确保它结束(提交)旧事务并启动新事务以获取更新数据。
另一种方法是使用具有隔离级别读取提交的事务,但这可能有其缺点,具体取决于应用程序的作用。