代码之家  ›  专栏  ›  技术社区  ›  Damien Sawyer

PostgreSQL序列化插入交错序列号

  •  0
  • Damien Sawyer  · 技术社区  · 6 年前

    我有多个进程使用序列化隔离级别插入Postgres(10.3)表。

    我们系统的另一部分需要读取这些记录,并确保它按顺序接收所有这些记录。例如,在下图中,消费者需要

    select * from table where sequanceNum > 2309 limit 5
    

    然后接收序列号2310、2311、2312、2313和2314。

    读取查询正在使用READCOMMITTED隔离级别。

    我的问题是,他们是怎么把序列号和334250的序列号交织在一起的?为什么这些事务没有被merrit阻止所有正在序列化的写事务?

    关于如何实现我的目标有什么建议吗?也就是说,保证不同的事务不会生成交错的序列号(如果有空隙也没关系。。。。但它们不能交错)。

    非常感谢你的帮助。我都快掉头发了!

    我刚刚注意到334250有一个非零的xmax。这是我遗漏的线索吗?

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   Laurenz Albe    6 年前

    SQL标准以其通常的简洁定义 SERIALIZABLE

    在隔离级别执行并发SQL事务 可序列化 可序列化执行被定义为并发执行SQL事务的操作的执行 在下一个SQL事务开始之前,每个SQL事务执行到完成。

    不幸的是,等价的序列顺序在事务开始时并不清楚,因为事务中稍后的语句可以确定事务的“逻辑”顺序。

    另一方面,序列号是根据请求编号时的墙时间排序的。

    在某种程度上,您需要序列号,序列号是由一些在事务提交之前不确定的东西决定的,这在术语上是矛盾的。

    SHARE ROW EXCLUSIVE 插入数据前的模式。

    我的问题是