PostgreSQL 默认隔离级别
PostgreSQL 的默认事务隔离级别是 读已提交(Read Committed),这是其事务处理系统的基础行为模式。
一 默认隔离级别概述
1.1 默认设置
-- 查看当前隔离级别
SHOW default_transaction_isolation;
-- 典型输出:read committed
输出示例:
postgres=# SHOW default_transaction_isolation;
default_transaction_isolation
-------------------------------
read committed
(1 row)
1.2 各版本一致性
PostgreSQL 版本 | 默认隔离级别 | 主要变化 |
---|---|---|
7.4 及之前 | 读已提交 | 基础实现 |
8.0 - 8.3 | 读已提交 | 改进快照 |
8.4 - 当前 | 读已提交 | 优化实现 |
二 读已提交的特性
2.1 行为特征
- 语句级快照:每条SQL语句看到的是语句开始时已提交的数据
- 无脏读:绝不会读取未提交的数据
- 允许非重复读:同一事务内相同查询可能返回不同结果
- 允许幻读:可能看到其他事务新增的符合条件的行
2.2 并发场景示例
-- 会话1
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- 会话2 (默认隔离级别)
BEGIN;
SELECT balance FROM accounts WHERE id = 1; -- 看到旧值(不阻塞)
COMMIT;
-- 会话1提交后
-- 会话2再次查询将看到新值
SELECT balance FROM accounts WHERE id = 1; -- 看到新值
三 与其他隔离级别对比
3.1 完整隔离级别支持
隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现机制 |
---|---|---|---|---|
读未提交 | ❌ 允许 | ❌ 允许 | ❌ 允许 | 实际实现为读已提交 |
读已提交 | ✅ 防止 | ❌ 允许 | ❌ 允许 | 语句级快照(默认) |
可重复读 | ✅ 防止 | ✅ 防止 | ❌ 允许 | 事务级快照 |
可串行化 | ✅ 防止 | ✅ 防止 | ✅ 防止 | 谓词锁+冲突检测 |
3.2 性能与一致性权衡
四 如何修改隔离级别
4.1 会话级修改
BEGIN;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 后续操作使用新隔离级别
COMMIT;
4.2 连接级默认设置
ALTER DATABASE dbname SET default_transaction_isolation = 'repeatable read';
4.3 参数文件设置
# postgresql.conf
default_transaction_isolation = 'repeatable read'
五 生产环境建议
5.1 使用指南
场景类型 | 推荐隔离级别 | 理由 |
---|---|---|
大多数OLTP | 读已提交 | 平衡性能与一致性 |
财务系统 | 可重复读 | 防止余额不一致 |
报表查询 | 可重复读 | 保证数据快照一致 |
高竞争系统 | 可串行化 | 防止并发异常 |
5.2 监控长事务
-- 检查可能造成问题的长事务
SELECT pid, now() - xact_start AS duration, query
FROM pg_stat_activity
WHERE state = 'idle in transaction'
ORDER BY duration DESC;
六 特殊注意事项
6.1 读未提交的实际行为
尽管SQL标准支持,但PostgreSQL实际将READ UNCOMMITTED
视为READ COMMITTED
:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- 实际仍为读已提交
6.2 可重复读的幻读"保护"
PostgreSQL的可重复读实际上通过快照技术也防止了幻读,这比SQL标准要求更强。
七 版本演进
版本 | 隔离级别重要改进 |
---|---|
8.1 | 引入SSI(可串行化快照隔离)基础 |
9.1 | 完善SSI实现 |
9.5 | 优化可串行化冲突检测 |
12 | 改进快照获取性能 |
PostgreSQL选择读已提交作为默认隔离级别,反映了其设计哲学:
- 实用主义:平衡性能与一致性需求
- 可预测性:行为符合大多数开发者预期
- 可扩展性:允许用户按需提升隔离级别
更详细的内容请查看官方文档:
https://www.postgresql.org/docs/17/transaction-iso.html
谨记:心存敬畏,行有所止。