我运行几个并行进程,每个进程都与firebirdSQL数据库建立了开放的连接。一个进程将捕获火鸟发布的更新事件:
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 数据!
任何建议为什么?
通常,当您看到旧数据时,您使用的是在提交数据更改之前启动的具有隔离级别快照(也称为并发)的事务。
您需要确保当进程 C 查询数据以响应通知时,它会结束(提交)旧事务并启动新事务以获取更新的数据。
另一种方法是使用已提交隔离级别读取的事务,但这可能会有其缺点,具体取决于应用程序的功能。