回答

收藏

在Postgres使用行版本实现增量客户端更新

技术问答 技术问答 230 人阅读 | 0 人回复 | 2023-09-14

我是Postgres到目前为止,新手们非常喜欢它。我已经尽力考虑这个问题,RTFM尽我所能,但已经结束了,所以我需要朝正确的方向推。
( F9 ]. X$ k5 h- r我正在设计一个数据库,每个感兴趣的实体都有一个rowversion从全局序列中分配值的列。因此,在最简单的情况下,在emps表中有两行:emp1withrowversion@3和emp2with
& H/ S; o! M! z2 e2 s0 A/ j$ e" nrowversion@5.我知道后emp2进行了修改emp1(即在以后的事务中-4 @. T& p' y( {) d, Z
不要介意同一事务中的行是否相同rowversion)。
3 W" ^( ~4 i5 u1 L$ c这构成了 数据同步逻辑    的基础,在这个 同步中    ,知道自己有@ 3之前的所有信息的客户端可以使用诸如之类的查询来获取最新更新SELECT *FROM emps WHERE rowversion>3 and rowversion) k6 g* `& R) X9 \$ ^
这是一个更新@ 3客户端示例方案-请因下列原因进行以下事务:2 i4 a0 J( e  X8 w3 J
@3 - committed@4 - committed@5 - committed@6 - in progress - not committed yet@7 - committed@8 - in progress - not committed yet@9 - committed客户端更新分为三个阶段:- J/ n1 s) r3 W; p. Z# c" j9 x+ C* G
[ol]询问数据库是否合适new_anchor。) g6 J5 A+ w: z% \* Z* h% B" d
执行SELECT * FROM emps WHERE rowversion>3 and rowversion7 v6 u2 r( X8 m
将new_anchor值与结果数据一起传输回客户端。[/ol]由于带有rowversion@ 6和@ 8行仍在进行中,new_anchor因此必须为@ 5,4 H; b. b5 @4 ?  y& X, E
这样我们的范围查询就不会丢失任何未提交的信息update    。现在客户可以放心了,直到@ 5到目前为止,一切都可以满足。
# h5 H4 @0 r. i9 x  U因此,实际问题 得以    提炼: 如何new_anchor在不强迫SERIALIZABLE或者在严重损害性能的情况下安全确定这一点?
4 _" i- F  ~5 @7 F如你所知,我是从SQL: B4 [( I2 j; r" x
Server借用这个想法,通过这个问题min_active_rowversion()函数很容易解决。在上述情况下,此函数将返回@( a1 w1 k) v' l$ }" E0 g+ `( `4 l
6,因此您new_anchor可以放心成为min_active_rowversion() -1。我有点了解如何使用active_rowversions表,触发器和在Postgres实现此功能SELECT min(id) FROMactive_rowversions,但这需要READ UNCOMMITTED隔离,而Postgres不提供隔离功能。
# R* O/ @2 N/ V/ V8 o" u/ D1 `' @我真的很感谢任何帮助或想法。
/ O# K; ]* N4 ~5 _                                                                9 S, k6 {3 H9 b
    解决方案:                                                               
2 x9 I5 A6 J" j( Q                                                                事实证明,得益于Postgres该解决方案比最初想象的要简单得多。+ n, H( `5 J" @7 @6 [: d  u5 Q- z7 f) b
txid_current()可用于在触发器中分配记录rowversion。6 j* ?. b, i3 i8 G4 i& A: T; C  L
txid_snapshot_min(txid_current_snapshot()可用于获得最小活动事务的方式和方式SQL Server用户可以使用相同的方式min_active_rowversion()。
最好的部分是64位,永久,不受清除的影响:" K8 c5 d" M! k# ~
这些函数导出64位格式,使用 epoch因此,计数器在安装过程中不会回绕。
: x. z7 F0 f% ^Postgres确实很棒。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则