提问人:mamcx 提问时间:10/12/2022 最后编辑:mamcx 更新时间:10/13/2022 访问量:67
像 PostgreSQL 这样的 RDBM 如何实现持久的序列,但又不是正常事务的一部分?
How RDBMs like PostgreSQL implement durable sequences and yet not be parts of normal transactions?
问:
在 PostgreSQL 中,您可以回滚事务,序列将继续向前。
但是,如何以持久的方式存储序列呢?我想知道这是如何实现的(我正在做一个 RDBM),在我看来好像存在 2 个数据库,一个用于序列,另一个用于常规表。
所以,看起来事情是这样运作的:
BEGIN TRANSACTION
INSERT table (id, name) values (
next = sequence.next()
COMMIT(sequence)
,
"hello"
);
ROLLBACK TRANSACTION
但是内部 COMMIT 如何不回滚呢?
答:
0赞
Laurenz Albe
10/12/2022
#1
与所有其他对象一样,对序列的更改将记录到 WAL,以便恢复可以从备份或崩溃后恢复状态。由于写入 WAL 会影响性能,因此并非每个调用都会记录到 WAL。相反,第一个呼叫记录的值比当前值早 32 个数字,接下来的 32 个呼叫不记录任何内容。nextval
nextval
您可以在我的文章中找到有关序列和事务主题的更多信息。
由于您想知道 for 序列在 : 的情况下如何工作,因此没有对序列的特殊提交。记录并重播 WAL 记录。在 PostgreSQL 中,无论事务是否提交,事务都会在恢复期间重放。如果事务回滚,正常的表修改将变得“不可见”。但是对序列的修改已经到位(序列行被覆盖),并且在回滚后没有任何内容变得不可见。COMMIT
ROLLBACK
评论
1赞
mamcx
10/13/2022
令我感到困惑的是序列的 COMMIT 在 ROLLBACK 的情况下是如何工作的。
上一个:向具有重复值的列添加顺序值
评论