从文档中,我的理解是,当在事务中发出 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;
问题可能出在哪里?
因为对 UNLOGGED 表所做的更改绕过了 WAL,所以回滚对未记录表所做的更改理论上应该不会产生任何影响。
如果
rollback
“倒带”WAL 就会出现这种情况,但事实并非如此。仅当您 commit
时,您才会获得 WAL 条目。当您rollback
时,您就放弃了如果您提交的话将会去那里的更改。
unlogged
对象上的流量不会进入WAL,但仍然必须提交应用 - 通过回滚,您放弃了所做的更新,然后再将其应用/写入任何地方。