PostgreSQL中UNLOGGED表ROLLBACK生效异常问题咨询
为什么PostgreSQL中UNLOGGED表的ROLLBACK会生效?
你提到的测试场景代码如下:
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的作用存在误解:
- UNLOGGED表绕开WAL,不影响事务原子性:WAL(Write-Ahead Logging)的核心职责是保证数据库崩溃恢复时,已提交的事务变更不会丢失。而事务的原子性(包括回滚)是由PostgreSQL的MVCC(多版本并发控制)机制和内存缓冲区管理实现的,和WAL无关。
- 事务回滚的逻辑不依赖WAL:事务执行过程中,所有未提交的变更都只存在于内存缓冲区中,同时PostgreSQL会保留数据的旧版本(相当于隐含的undo日志)。当执行ROLLBACK时,数据库会直接丢弃内存中未提交的修改,或者用旧版本数据覆盖未提交的新版本,整个过程不需要读取或操作WAL。
- UNLOGGED表的限制仅针对崩溃恢复:它只是不将变更写入WAL,所以数据库崩溃重启后,UNLOGGED表中所有已提交的变更会丢失。但在事务未提交时,这些变更还停留在内存里,完全可以被正常回滚。
简单说:你测试中的UPDATE操作还没提交,根本没涉及到WAL的写入,ROLLBACK自然能正常撤销内存中的临时修改。
内容的提问来源于stack exchange,提问作者Hicham Moustaid
相关产品推荐
相关产品推荐

