隔离级别

最近更新时间:2026-02-05 11:01:13

我的收藏

概述

数据库事务隔离级别是控制并发事务之间相互影响程度的机制,核心目标是在保证数据一致性的前提下兼顾并发性能。SQL 标准定义了四种级别,每种级别解决了不同的数据异常问题。

数据异常类型说明

脏读:一个事务读取了另一个未提交事务修改的数据。
不可重复读:同一事务内多次读取同一数据,结果不一致(数据被其他已提交事务修改)。
幻读:同一事务内多次按相同条件查询,返回的记录集不一致(有其他已提交事务插入或删除数据)。

隔离级别对比表

隔离级别
脏读
不可重复读
幻读
适用场景
读未提交​(Read Uncommitted)
可能
可能
可能
基本不推荐使用
读已提交​(Read Committed)
不可能​
可能
可能
读写分离、实时性要求高
可重复读​(Repeatable Read)
不可能​
不可能​
可能(但 MySQL InnoDB 和 TDSQL Boundless 已很大程度上解决)
默认级别,复杂业务逻辑
可串行化​(Serializable)
不可能​
不可能​
不可能​
最高一致性要求

TDSQL Boundless 的隔离级别行为分析

TDSQL Boundless 仅支持读已提交(Read Committed)可重复读(Repeatable Read)两种隔离级别。默认隔离级别为可重复读级别。

Repeatable Read 级别

TDSQL Boundless 完全支持 Repeatable Read 隔离级别,其行为与 MySQL 高度相似。更准确地说,TDSQL Boundless 支持的是快照隔离级别,该级别不会出现幻读异常,但是依然可能出现写偏斜异常。
快照获取方式:事务首次读取时会创建一致性视图(快照),后续的读操作都会基于这个快照,从而保证在本事务内读到的数据是一致的。

Read Committed 级别

TDSQL Boundless 也支持 Read Committed 级别,但其实现方式与 MySQL 有显著不同。
快照获取方式:TDSQL Boundless 在该级别下,每条查询语句都会重新获取最新的已提交数据快照。也就是说,单条语句内的读操作是在同一个快照下的,但是多个语句的读操作是在不同快照下的。
关键的锁行为差异:TDSQL Boundless 在 Read Committed 级别下的一些悲观锁行为与 Repeatable Read 级别类似,而不同于 MySQL 的 Read Committed。
在 MySQL 的 Read Committed 下:对于 SELECT ... FOR UPDATE这样的当前读,通常只对查询匹配的现有记录加锁,不会加间隙锁(Gap Lock),以减少锁冲突。
在 TDSQL Boundless 的 Read Committed 下:为了保证分布式环境下的严格一致性,它仍然会使用范围锁。这意味着,即使是在 Read Committed 级别,一个执行范围查询并加锁的事务,仍然可能阻止其他事务向该范围内插入数据,这一点与其 Repeatable Read 级别的行为相似。