94人参与 • 2025-06-16 • MsSqlserver
postgresql 的默认事务隔离级别是 读已提交(read committed),这是其事务处理系统的基础行为模式。
-- 查看当前隔离级别 show default_transaction_isolation; -- 典型输出:read committed
输出示例:
postgres=# show default_transaction_isolation; default_transaction_isolation ------------------------------- read committed (1 row)
| postgresql 版本 | 默认隔离级别 | 主要变化 |
|---|---|---|
| 7.4 及之前 | 读已提交 | 基础实现 |
| 8.0 - 8.3 | 读已提交 | 改进快照 |
| 8.4 - 当前 | 读已提交 | 优化实现 |
-- 会话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; -- 看到新值
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 实现机制 |
|---|---|---|---|---|
| 读未提交 | ❌ 允许 | ❌ 允许 | ❌ 允许 | 实际实现为读已提交 |
| 读已提交 | ✅ 防止 | ❌ 允许 | ❌ 允许 | 语句级快照(默认) |
| 可重复读 | ✅ 防止 | ✅ 防止 | ❌ 允许 | 事务级快照 |
| 可串行化 | ✅ 防止 | ✅ 防止 | ✅ 防止 | 谓词锁+冲突检测 |

begin; set transaction isolation level repeatable read; -- 后续操作使用新隔离级别 commit;
alter database dbname set default_transaction_isolation = 'repeatable read';
# postgresql.conf default_transaction_isolation = 'repeatable read'
| 场景类型 | 推荐隔离级别 | 理由 |
|---|---|---|
| 大多数oltp | 读已提交 | 平衡性能与一致性 |
| 财务系统 | 可重复读 | 防止余额不一致 |
| 报表查询 | 可重复读 | 保证数据快照一致 |
| 高竞争系统 | 可串行化 | 防止并发异常 |
-- 检查可能造成问题的长事务 select pid, now() - xact_start as duration, query from pg_stat_activity where state = 'idle in transaction' order by duration desc;
尽管sql标准支持,但postgresql实际将read uncommitted视为read committed:
set transaction isolation level read uncommitted; -- 实际仍为读已提交
postgresql的可重复读实际上通过快照技术也防止了幻读,这比sql标准要求更强。
| 版本 | 隔离级别重要改进 |
|---|---|
| 8.1 | 引入ssi(可串行化快照隔离)基础 |
| 9.1 | 完善ssi实现 |
| 9.5 | 优化可串行化冲突检测 |
| 12 | 改进快照获取性能 |
postgresql选择读已提交作为默认隔离级别,反映了其设计哲学:
更详细的内容请查看官方文档:https://www.postgresql.org/docs/17/transaction-iso.html
到此这篇关于postgresql 默认隔离级别的设置的文章就介绍到这了,更多相关postgresql 默认隔离级别内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论