并发事务的问题 读未提交 (Read Uncommitted)[!danger] 最低隔离级别允许读取未提交的数据变更。特点可能发生脏读、不可重复读、幻读性能最高应用场景极少使用仅适用于对一致性要求极低的场景-- MySQL 设置方式SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;2. 读已提交 (Read Committed)[!note] 大多数数据库默认级别只允许读取已提交的数据变更。特点可能发生不可重复读、幻读避免脏读性能较好应用场景大多数 OLTP 系统-- MySQL 设置方式SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;实现原理通过 MVCC多版本并发控制每次查询生成一个新的 Read View。3. 可重复读 (Repeatable Read)[!tip] MySQL InnoDB 默认级别确保同一事务内多次读取同一数据的结果一致。特点可能发生幻读但在 MySQL InnoDB 中通过 MVCC Next-Key Lock 已解决避免脏读、不可重复读性能中等应用场景需要数据一致性保障的业务-- MySQL 设置方式SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;实现原理MVCC事务开始时生成 Read View后续查询使用同一 ViewNext-Key Lock锁定记录及其间隙防止幻读4. 可串行化 (Serializable)[!danger] 最高隔离级别强制事务串行执行完全避免并发问题。特点可能发生无并发问题避免脏读、不可重复读、幻读性能最低应用场景对一致性要求极高的金融业务-- MySQL 设置方式SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;实现原理通过锁机制读取时加共享锁写入时加排他锁。隔离级别对比表隔离级别脏读不可重复读幻读性能开销Read Uncommitted✓✓✓最低Read Committed✗✓✓较低Repeatable Read✗✗✓*中等Serializable✗✗✗最高[!info] 关于幻读MySQL InnoDB 在 Repeatable Read 级别通过 Next-Key Lock 已实际解决了幻读问题所以标注为 ✓*。三大数据库对比[!abstract] MySQL vs PostgreSQL vs SQL Server三大主流数据库在隔离级别的默认设置、实现机制和语法上存在差异。默认隔离级别数据库默认级别幻读处理MySQL (InnoDB)Repeatable Read通过 MVCC Next-Key Lock 解决PostgreSQLRead CommittedRR 级别仍可能幻读SQL ServerRead CommittedRR 级别仍可能幻读[!tip] 关键差异MySQL 默认隔离级别更高RR而 PostgreSQL 和 SQL Server 默认为 RC。MySQL 在 RR 级别已解决幻读其他两者需要使用 Serializable 才能完全避免。设置语法对比 MySQLsql-- 查看当前级别SELECT transaction_isolation;-- 设置级别SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 或在启动时指定SET transaction_isolation READ-COMMITTED; PostgreSQLsql-- 查看当前级别SHOW transaction_isolation;-- 设置级别连接级别SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 单次事务设置BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 配置文件设置 (postgresql.conf)default_transaction_isolation repeatable read SQL Serversql-- 查看当前级别DBCC USEROPTIONS;-- 设置级别SET TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 使用快照隔离需先启用ALTER DATABASE MyDB SET ALLOW_SNAPSHOT_ISOLATION ON;SET TRANSACTION ISOLATION LEVEL SNAPSHOT;实现机制对比MySQL (InnoDB)[!note] MVCC Next-Key LockRead Committed每次查询生成新 Read ViewRepeatable Read事务首次查询生成 Read View后续复用Next-Key Lock锁定记录 间隙防止幻读MVCCRead ViewNext-Key LockRecord LockGap Lock避免脏读/不可重复读锁定当前行锁定间隙防止插入PostgreSQL[!note] 纯 MVCC 实现不使用锁实现隔离完全依赖 MVCCRead Committed每条语句获取新快照Repeatable Read事务获取一个快照并持续使用Serializable通过 SSI (Serializable Snapshot Isolation) 检测冲突[!warning] PostgreSQL 注意事项PostgreSQL 的 Repeatable Read 实际上是 Snapshot Isolation可能发生写倾斜Write Skew异常需要 Serializable 才能完全避免。SQL Server[!note] 锁机制 快照隔离Read Committed默认使用锁可通过 READ_COMMITTED_SNAPSHOT 启用 MVCCRepeatable Read锁机制持有共享锁直到事务结束Serializable锁机制使用范围锁防止幻读Snapshot可选级别类似 PostgreSQL 的 SI特殊隔离级别数据库特殊级别说明MySQL无标准四种级别PostgreSQL无标准四种级别RR 实为 SISQL ServerSnapshotMVCC 实现类似 SISQL ServerRead Committed SnapshotRC 的 MVCC 版本幻读解决方案对比| 数据库 | Repeatable Read 幻读 | Serializable 幻读 ||-------|:--------------------:|:-----------------:|| MySQL | ✗ 已解决 | ✗ 已解决 || PostgreSQL | ✓ 可能发生 | ✗ 已解决 (SSI) || SQL Server | ✓ 可能发生 | ✗ 已解决 (范围锁) |[!example] MySQL 幻读解决方案示例-- 事务 ABEGIN;SELECT * FROM users WHERE age 20; -- 返回 5 条-- Next-Key Lock 锁定 age 20 的范围-- 事务 B 尝试插入INSERT INTO users (age) VALUES (25); -- 被阻塞-- 事务 A 再次查询SELECT * FROM users WHERE age 20; -- 仍返回 5 条无幻读COMMIT;