PostgreSQL 默认隔离级别的设置


    目录
  • 一 默认隔离级别概述
    • 1.1 默认设置
    • 1.2 各版本一致性
  • 二 读已提交的特性
    • 2.1 行为特征
    • 2.2 并发场景示例
  • 三 与其他隔离级别对比
    • 3.1 完整隔离级别支持
    • 3.2 性能与一致性权衡
  • 四 如何修改隔离级别
    • 4.1 会话级修改
    • 4.2 连接级默认设置
    • 4.3 参数文件设置
  • 五 生产环境建议
    • 5.1 使用指南
    • 5.2 监控长事务
  • 六 特殊注意事项
    • 6.1 读未提交的实际行为
    • 6.2 可重复读的幻读"保护"
  • 七 版本演进

    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 默认隔离级别内容请搜索电脑手机教程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持电脑手机教程网!