MySQL InnoDB 事务隔离级别详解(脏读,不可重复读,幻读)

本文主要介绍了 MySQL InnoDB 支持的四种事务隔离级别,围绕隔离级别,解释了脏读,不可重复读,以及幻读的概念。

1. MySQL 支持的四种隔离级别

隔离性 isolation (I) 是事务 ACID 四种属性中的一种,它定义了如何将事务与事务之间隔离开来,隔离性是应用程序设计的关键因素之一。根据 SQL:1992 标准,InnoDB 支持四种隔离级别。下面按顺序列出了这些隔离级别的类型,从上到下,隔离性越好,事务的一致性也越高。

  • READ-UNCOMMITTED
  • READ-COMMITTED
  • REPEATABLE-READ(MySQL默认的隔离级别)
  • SERIALIZABLE

可以动态修改会话的隔离级别,在 MySQL 中通过修改参数 transaction_isolation 来动态修改隔离级别,如下:

set global transaction_isolation='read-committed';

2. 读未提交(READ-UNCOMMITTED)

  • 不需要锁
  • 可能会出现脏读,不可重复读,幻读

下面将通过例子演示读未提交,演示脏读现象。创建 2 个会话,设置隔离级别为读未提交。

session1:

mysql> set global transaction_isolation='read-uncommitted'; Query OK, 0 rows affected (0.00 sec) mysql> \r Connection id:    16 Current database: percona mysql> select * from ReadUncommit; +----+------+ | id | name | +----+------+ |  1 | jc   | |  2 | herc | |  3 | sri  | +----+------+ 3 rows in set (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> update ReadUncommit set name='ram' where id=3; Query OK, 1 row affected (0.00 sec) Rows matched: 1  Changed: 1  Warnings: 0