概述
数据库事务隔离级别是控制并发事务之间相互影响程度的机制,核心目标是在保证数据一致性的前提下兼顾并发性能。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 级别的行为相似。