在更新事件后的不同连接上接收不同的数据
Receving different data on different connections on AFTER UPDATE event
我 运行 几个并行进程,每个进程都打开了到 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[= 通知33=] 关于要检查的数据集。
Process B 执行 select
语句并检索更新的数据。一切都很好。
进程 C 执行 select
语句并在执行更新之前检索 OLD 数据!
有什么建议吗?
通常当您看到旧数据时,您使用的是在提交数据更改之前启动的具有隔离级别快照(也称为并发)的事务。
您需要确保当进程 C 查询数据以响应通知时,它会结束(提交)旧事务并启动新事务以获取更新后的数据。
另一种方法是使用隔离级别已提交读的事务,但这可能有其缺点,具体取决于您的应用程序的用途。
我 运行 几个并行进程,每个进程都打开了到 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[= 通知33=] 关于要检查的数据集。
Process B 执行 select
语句并检索更新的数据。一切都很好。
进程 C 执行 select
语句并在执行更新之前检索 OLD 数据!
有什么建议吗?
通常当您看到旧数据时,您使用的是在提交数据更改之前启动的具有隔离级别快照(也称为并发)的事务。
您需要确保当进程 C 查询数据以响应通知时,它会结束(提交)旧事务并启动新事务以获取更新后的数据。
另一种方法是使用隔离级别已提交读的事务,但这可能有其缺点,具体取决于您的应用程序的用途。