当前位置: 首页 > 面试题库 >

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

长孙景天
2023-03-14
问题内容

我是Postgres的新手,到目前为止很喜欢它。我已经尽了最大的努力来考虑这个问题,RTFM已尽我所能,但是已经走到了尽头,因此我需要朝着正确的方向轻推。

我正在设计一个数据库,其中每个感兴趣的实体都有一个rowversion从全局序列中分配值的列。因此,在最简单的情况下,在emps具有两行的表中:emp1withrowversion@3emp2with
rowversion@5,我知道之后emp2进行了修改emp1(即在以后的事务中-
不必介意同一事务中的行是否具有相同的rowversion)。

这构成了 数据同步逻辑 的基础,在该 同步中 ,知道自己拥有@ 3之前的所有信息的客户端可以使用诸如之类的查询来获取最新更新SELECT * FROM emps WHERE rowversion>3 and rowversion<=new_anchor

这是一个已经更新@ 3的客户端的示例方案-由于以下原因,请进行以下事务:

@3 - committed
@4 - committed
@5 - committed
@6 - in progress - not committed yet
@7 - committed
@8 - in progress - not committed yet
@9 - committed

客户端更新分三个阶段执行:

  1. 询问数据库是否合适new_anchor
  2. 执行SELECT * FROM emps WHERE rowversion>3 and rowversion<=new_anchor
  3. new_anchor值与结果数据一起传递回客户端。

由于带有rowversion@ 6和@ 8的行仍在进行中,new_anchor因此必须为@ 5,
以便我们的范围查询不会丢失任何未提交的update 。现在,客户可以放心,直到@ 5为止,一切都可以满足。

因此,实际问题 得以 提炼: 如何new_anchor在不强迫SERIALIZABLE或严重损害性能的情况下安全地确定这一点?

如您所知,我是从SQL
Server借用这个想法的,该问题通过该min_active_rowversion()函数可以轻松解决。在上述情况下,此函数将返回@
6,因此您new_anchor可以放心地成为min_active_rowversion() - 1。我有点了解如何使用active_rowversions表,触发器和在Postgres中实现此功能SELECT min(id) FROM active_rowversions,但这需要READ UNCOMMITTED隔离,而Postgres中不提供隔离功能。

我真的很感谢任何帮助或想法。


问题答案:

事实证明,得益于Postgres的系统信息功能,该解决方案比最初想像的要简单得多。

  • txid_current()可以在触发器中用于分配记录的rowversion
  • txid_snapshot_min(txid_current_snapshot())可以用来获得最小活动事务,其方式与SQL Server用户可能使用的方式相同min_active_rowversion()

最好的部分是这些是64位的,永久的,不受清除的影响:

这些函数导出64位格式,该格式使用“ epoch”计数器扩展,因此在安装期间不会回绕。

Postgres确实很棒。



 类似资料:
  • 本文向大家介绍使用Appcan客户端自动更新PHP版本号(全),包括了使用Appcan客户端自动更新PHP版本号(全)的使用技巧和注意事项,需要的朋友参考一下 在项目开发过程中遇到app端自动更新,查阅了相关资料然后把Appcan客户端自动更新PHP版本号的方法整理出来,具体代码讲解如下。 服务端文件:update.php、version.php、version.xml update.php 内容

  • 我有一个表,它有,,和 在常规插入时自动递增。 的值介于1到10之间,因为有10个问题,但对表来说不是唯一的,并且依赖于列。 用于引用单独表中的报表。 我要实现的是,如果对于特定的没有冲突的,则插入新的记录。如果有冲突,则用新的

  • 问题内容: 客户端 我有一个使用基本POST或GET方法连接到远程服务器的Java应用程序: (我不能改变这个代码,唯一的东西,我可以改变的是与调用方法时发送到服务器)。 [编辑] :客户端可以是Java客户端或任何其他客户端(c ++,objective-c,..)。这里的重点是,我只能访问帖子正文以及URL中的内容。 服务器端 在服务器端,我想实现Spring Security(Securit

  • 现代 Web 应用程序, 除了呈现并发送到浏览器的静态 HTML 页面外, 还包含 JavaScript, 用于通过操纵现有元素或通过 AJAX 加载新内容来修改浏览器中的页面。 本节介绍 Yii 提供的用于向网站添加 JavaScript 和 CSS 以及动态调整它们的方法。 注册脚本 使用 yii\web\View 对象时,可以动态注册前端脚本。 这里有两个专门的方法: registerJs(

  • 介绍 回忆下第10部分中的客户端5.1版。客户端使用一个Deferred来管理所有的回调链,其中包括一个格式转换引擎的调用。在那个版本中,这个引擎的实现是同步的。 现在我们想实现一个新的客户端,使用我们在第十二部分实现的服务器提供的格式转换服务。但这里有一个问题需要说清楚:由于格式转换服务是通过网络获取的,因此我们需要使用异步I/O。这也就意味着我们获取格式转换服务的API必须是异步实现的。换句话

  • 由于我不知道的原因,这在我的最新函数中不起作用: 语法错误表明它在之后按字面意思解释,而不是展开它。我如何让它在这里使用变量值而不是文字值?我知道在中可能是一个不同的上下文,但肯定有一种方法可以在所有地方编写这个模式名的脚本?