事务隔离级别是数据库管理系统(DBMS)中用于控制并发事务之间相互影响的程度。它定义了一个事务在访问数据时,是否能看到其他事务的中间状态或未提交的数据。SQL 标准中定义了四种事务隔离。

四种事务隔离级别

  1. 隔离级别概述
隔离级别 说明 存在问题
Read Uncommited 允许事务读未提交的事务 脏读
Read commited 只能读已提交的事务 不可重复读
Repeatable Read 同一事务中多次读取结果(不可重复读解决) 幻读
Serializable 严格的隔离级别,事务完全串行执行 无并发问题,性能低
  1. 详细描述

(1)Read Uncommited(读取未提交)

  • 描述:事务可以读取其他事务未提交的数据。
  • 优点:最低隔离级别,性能较高。
  • 可能出现脏读,即一个事务读取到另一个未提交事务的修改,导致数据不一致。
  • 适用场景:对数据一致性要求不高的场景。
  • 示例:
  1. 事务A修改了数据但是未提交
  2. 事务B读取了事务A修改的数据
  3. 如果事务A回滚了,事务B读取的数据就无效

(2)Read Commited(读取已提交)

  • 描述:事务只能读取其他事务以及提交的数据
  • 优点:避免了脏读
  • 缺点:可能出现不可重复读的情况,即同一个事务中多次读取同一条数据,结果可能不同
  • 适用场景:大多数系统的默认隔离级别(如 Oracle 和 SQL Server)。
  • 示例:
  1. 事务A读取了数据
  2. 事务B修改了该数据并提交
  3. 事务A再次读取数据,发现结果与第一次结果不一致

(3)Repeatable Read(可重复读)

  • 描述:在同一个事务中,多次读取结果一致,避免了不可重复读的情况
  • 优点:避免了脏读和不可重复读问题
  • 缺点:可能出现幻读,即同一事务中执行范围查询,其他事务插入了符合条件的数据
  • 适用场景:MySQL的默认隔离级别
  • 示例:
  1. 事务A查询某个条件的数据范围
  2. 事务B插入了一条符合的查询范围的数据
  3. 事务A再次查询,发现结果多了一条数据

(4)Serializable(可串行化)

  • 描述:最高隔离级别,事务按顺序逐一执行,完全避免并发问题
  • 优点:解决了脏读、不可重复读和幻读问题。
  • 缺点:性能最低,通常通过锁机制实现,可能导致大量阻塞。
  • 使用场景:对数据一致性要求极高,且并发量较低的场景。
  • 实现方式
  • 悲观锁: 通过加锁保证事务串行执行。
  • MVCC: 通过多版本并发控制(MySQL InnoDB 在 Repeatable Read 中使用)。

MVCC(多版本并发控制器)

  • 原理:

    • 在可重复读和读取已提交隔离级别下,MySQL 的 InnoDB 存储引擎使用 MVCC 解决并发问题。
    • 每条记录维护多个版本(隐藏的行版本号 trx_id 和回滚指针 undo log)。通过时间戳确保事务只读到符合当前时间点的数据。
  • 特点:

    • 读取操作不加锁,依赖快照,性能高。
    • 适用于 Read Committed 和 Repeatable Read。

MySQL 中的事务隔离级别

在 MySQL 中,可以通过以下命令查看或设置隔离级别:

查看当前隔离级别:

SELECT @@transaction_isolation;

设置隔离级别:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

设置全局隔离级别:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

爱跑步的猕猴桃
1 声望0 粉丝