PostgreSQL遵循SQL标准定义了四种事务隔离级别,不同隔离级别通过不同的锁策略和版本控制机制,实现不同程度的并发数据一致性保障,对应的锁行为也存在明显差异。

PostgreSQL支持的隔离级别
PostgreSQL实际支持的隔离级别包括读未提交、读已提交、可重复读、串行化,其中读未提交在PostgreSQL中会被自动映射为读已提交,因此实际生效的隔离级别为后三种。不同隔离级别的核心差异体现在锁的获取时机、持有范围以及多版本并发控制(MVCC)的使用策略上。
读已提交隔离级别的锁行为
读已提交是PostgreSQL的默认隔离级别,该级别下每个查询都会看到在查询开始之前已经提交的事务对数据的修改。对应的锁行为如下:
- 写操作会对目标行加行级排他锁,事务提交或回滚后释放该锁
- 读操作不会加行级共享锁,而是通过MVCC机制读取符合可见性规则的行版本
- 如果写操作遇到其他事务已经持有的行排他锁,会等待锁释放后再执行
下面是读已提交隔离级别下的事务示例:
-- 事务1:读已提交级别下更新数据 BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; UPDATE user_table SET balance = balance - 100 WHERE user_id = 1; -- 此时事务未提交,行排他锁持有中 COMMIT; -- 事务2:同时执行读已提交查询 BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT balance FROM user_table WHERE user_id = 1; -- 如果事务1未提交,读到的还是更新前的余额 COMMIT;
可重复读隔离级别的锁行为
可重复读隔离级别保证同一个事务中多次执行相同的查询,得到的结果集一致,不会出现不可重复读的问题。对应的锁行为相比读已提交有以下变化:
- 写操作同样加行级排他锁,事务结束后释放
- 事务开始时获取一个事务快照,整个事务期间都使用该快照判断数据可见性
- 如果事务执行更新时,发现目标行已经被其他已提交事务修改过,会直接报错回滚,避免丢失更新
可重复读隔离级别的事务示例如下:
-- 事务1:可重复读级别下查询 BEGIN; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT balance FROM user_table WHERE user_id = 1; -- 第一次查询得到结果100 -- 事务2:在另一个会话更新数据并提交 BEGIN; UPDATE user_table SET balance = 200 WHERE user_id = 1; COMMIT; -- 事务1再次查询 SELECT balance FROM user_table WHERE user_id = 1; -- 第二次查询仍然得到100,符合可重复读特性 COMMIT;
串行化隔离级别的锁行为
串行化隔离级别是最高级别的隔离级别,保证事务执行的效果和串行执行所有事务的效果一致,不会出现幻读问题。对应的锁行为最为严格:
- 除了行级排他锁之外,还会对查询涉及的范围加谓词锁,防止其他事务插入符合查询条件的新数据
- 事务提交时会检查是否存在序列化冲突,如果存在冲突则回滚事务
- 读操作也会通过谓词锁阻止其他事务插入符合条件的行,避免幻读
串行化隔离级别的事务示例如下:
-- 事务1:串行化级别下范围查询 BEGIN; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SELECT * FROM user_table WHERE age > 18; -- 此时会加范围谓词锁,阻止其他事务插入age>18的新行 -- 事务2:尝试插入符合条件的数据 BEGIN; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; INSERT INTO user_table (user_id, age, balance) VALUES (2, 20, 0); -- 事务2提交时可能检测到序列化冲突,直接回滚 COMMIT; -- 事务1提交 COMMIT;
不同隔离级别锁行为对比
下面是三种隔离级别的锁行为核心差异对比:
| 隔离级别 | 行锁持有时间 | 是否加范围锁 | 是否支持MVCC读 | 并发性能 |
|---|---|---|---|---|
| 读已提交 | 事务结束释放 | 否 | 是 | 最高 |
| 可重复读 | 事务结束释放 | 否 | 是 | 中等 |
| 串行化 | 事务结束释放 | 是 | 是 | 最低 |
隔离级别选择建议
在实际业务开发中,需要根据业务对数据一致性的要求选择合适的隔离级别:
- 如果业务对一致性要求不高,追求最高并发性能,可以选择默认的读已提交级别
- 如果需要避免不可重复读,且业务中存在多次读取同一数据校验的场景,可以选择可重复读级别
- 如果业务对数据一致性要求极高,不允许出现幻读,且并发量不高,可以选择串行化级别
需要注意的是,更高隔离级别会带来更多的锁开销和事务冲突回滚概率,需要在一致性和性能之间做好平衡。
PostgreSQL隔离级别锁行为事务并发控制修改时间:2026-07-05 22:54:13