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