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
到此这篇关于postgresql 默认隔离级别的设置的文章就介绍到这了,更多相关postgresql 默认隔离级别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论