跟踪一段时间以来哪些数据发生了变化

时间:2015-04-04 09:46:11

标签: postgresql

在我们的应用程序中,我们有一个中央数据库和许多断开连接的客户端应用程序及其自己的本客户端连接到中央服务器,服务器应向他们发送自客户端上次连接以来已更改的数据。

由于客户端太多,并且其中一些客户端可能在不通知服务器的情况下不再存在,因此在每个客户端上保留服务器上的挂起更改是不切实际的。

这就是为什么在每个相关表中我们都有一个列update_date,它位于每个插入,每个更新设置为current_timestamp。删除操作以类似的方式处理,每个同步表都有一个辅助表,我们存储同步表的主键和delete_date

当客户端连接到服务器时,它会向服务器发送上一个同步时间戳,服务器将所有更改发送到update_date > last_sync,然后将事务的current_timestamp发送到客户端,作为last_sync

这种方法的问题在于,当存在T1 = 1000的正在运行的事务current_timestamp时,客户端在事务T2中与current_timestamp =连接2000.由于T2未在T1中看到尚未提交的更改,因此不会将其发送给客户端。下次客户端连接时,T1的更改已提交,但它们标有update_date = 1000,因此不会向客户端发送请求2000之后所做更改的客户端。

如何确保客户获得所有更改记录的任何建议?客户端可以多次获得相同的更改。

1 个答案:

答案 0 :(得分:1)

就个人而言,我会选择一个审计触发器来解决这个问题,如下所述:https://wiki.postgresql.org/wiki/Audit_trigger

之后,您可以选择如何应用更新(或者如果它们不相关则忽略其中一些更新)。


或者您可以尝试使用其中一个标准复制模块,其中一些异步模块应该可以解决这个问题:https://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling#Comparison_matrix

例如,{p> Bucardo是专为此类案件而设计的。