像 PostgreSQL 这样的 RDBM 如何实现持久的序列,但又不是正常事务的一部分?

How RDBMs like PostgreSQL implement durable sequences and yet not be parts of normal transactions?

提问人:mamcx 提问时间:10/12/2022 最后编辑:mamcx 更新时间:10/13/2022 访问量:67

问:

在 PostgreSQL 中,您可以回滚事务,序列将继续向前。

但是,如何以持久的方式存储序列呢?我想知道这是如何实现的(我正在做一个 RDBM),在我看来好像存在 2 个数据库,一个用于序列,另一个用于常规表。

所以,看起来事情是这样运作的:


BEGIN TRANSACTION

INSERT table (id, name) values (
   next = sequence.next()
   COMMIT(sequence)
   ,
   "hello"
);

ROLLBACK TRANSACTION

但是内部 COMMIT 如何不回滚呢?

数据库 PostgreSQL 事务 序列

评论

0赞 10/12/2022
Postgres 是开源的,它们对序列的实现也是开源的

答:

0赞 Laurenz Albe 10/12/2022 #1

与所有其他对象一样,对序列的更改将记录到 WAL,以便恢复可以从备份或崩溃后恢复状态。由于写入 WAL 会影响性能,因此并非每个调用都会记录到 WAL。相反,第一个呼叫记录的值比当前值早 32 个数字,接下来的 32 个呼叫不记录任何内容。nextvalnextval

您可以在我的文章中找到有关序列和事务主题的更多信息。

由于您想知道 for 序列在 : 的情况下如何工作,因此没有对序列的特殊提交。记录并重播 WAL 记录。在 PostgreSQL 中,无论事务是否提交,事务都会在恢复期间重放。如果事务回滚,正常的表修改将变得“不可见”。但是对序列的修改已经到位(序列行被覆盖),并且在回滚后没有任何内容变得不可见。COMMITROLLBACK

评论

1赞 mamcx 10/13/2022
令我感到困惑的是序列的 COMMIT 在 ROLLBACK 的情况下是如何工作的。