事务隔离级别
PostgreSQL 有哪些事务隔离级别?
隔离级别决定一个事务能看到多少并发事务所做的修改。PostgreSQL 默认使用 Read Committed,另外还提供 Repeatable Read 和 Serializable。
SQL 标准根据允许出现的异常定义了四种隔离级别:脏读、不可重复读、幻读和序列化异常。PostgreSQL 接受全部四个级别名称,但 Read Uncommitted 的行为与 Read Committed 相同,因此实际上只有三种:Read Committed、Repeatable Read 和 Serializable。
默认的 Read Committed 为每条语句提供新的快照,因此同一事务中的两次查询可能看到不同的数据。Repeatable Read 在整个事务中使用同一个快照。Serializable 增加了额外的检查,使并发事务的表现如同逐个依次执行。在这两个更严格的级别下,事务可能因序列化错误而失败,应用程序应重试该事务。
示例
该示例显示服务器的默认级别,然后开启一个 Repeatable Read 事务,并用 SHOW transaction_isolation 确认。该事务中的每次读取都使用同一个快照。
CREATE TABLE stock (sku text PRIMARY KEY, qty int);
INSERT INTO stock VALUES ('A-1', 5);
SHOW default_transaction_isolation;
BEGIN ISOLATION LEVEL REPEATABLE READ;
SHOW transaction_isolation;
SELECT qty FROM stock WHERE sku = 'A-1';
COMMIT;适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。