PostgreSQL 中的 UNLOGGED 表和 ROLLBACK

问题描述 投票:0回答:1

从文档中,我的理解是,当在事务中发出 ROLLBACK 命令时,PostgreSQL 通常采用预写日志记录 (WAL) 机制来撤消该事务中所做的更改。但是,由于对 UNLOGGED 表所做的更改会绕过 WAL,因此回滚对未记录表所做的更改理论上应该不会产生任何影响。我尝试复制这个场景,但我发现更改确实被回滚了。

DROP TABLE IF EXISTS test;
CREATE UNLOGGED TABLE test(
  id SERIAL PRIMARY KEY,
  first_name VARCHAR(32) NOT NULL,
  last_name VARCHAR(32) NOT NULL
);
INSERT INTO test(first_name,last_name)
VALUES ('Joe', 'Doe'), ('Sam', 'Fenjero'), ('Victoria', 'Rais');
BEGIN;
UPDATE test SET first_name = 'X';
UPDATE test SET last_name = 'Y';
ROLLBACK;

问题可能出在哪里?

sql postgresql transactions rollback
1个回答
0
投票

因为对 UNLOGGED 表所做的更改绕过了 WAL,所以回滚对未记录表所做的更改理论上应该不会产生任何影响。

如果

rollback
“倒带”WAL 就会出现这种情况,但事实并非如此。仅当您
commit
时,您才会获得 WAL 条目。当您
rollback
时,您就放弃了如果您提交的话将会去那里的更改。

unlogged
对象上的流量不会进入WAL,但仍然必须提交应用 - 通过回滚,您放弃了所做的更新,然后再将其应用/写入任何地方。

© www.soinside.com 2019 - 2024. All rights reserved.