Read Uncommitted允许读到尚未提交的事务的修改之后的数据。
2. 脏读
Read Uncommitted是隔离级别最低的一种事务级别。
在这种隔离级别下,一个事务会读到另一个事务更新后但未提交的数据,如果另一个事务回滚,那么当前事务读到的数据就是脏数据,这就是脏读(Dirty Read)。
3. 例子
首先,我们准备好students
表的数据,该表仅一行记录:
mysql> select * from students;
+----+-------+
| id | name |
+----+-------+
| 1 | Alice |
+----+-------+
1 row in set (0.00 sec)
然后,分别开启两个MySQL客户端连接,按顺序依次执行事务A和事务B:
时刻事务A事务B1// 设置隔离级别
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;2// 开始事务
BEGIN;
BEGIN;3// 更新Alice为Bob
UPDATE students SET name = 'Bob' WHERE id = 1;
4// 读到“Bob"
SELECT * FROM students WHERE id = 1;
5// 回滚
ROLLBACK;
6// 读到”Alice"
SELECT * FROM students WHERE id = 1;
7 COMMIT;
当事务A执行完第3步时,它更新了id=1
的记录,但并未提交,而事务B在第4步读取到的数据就是未提交的数据。
随后,事务A在第5步进行了回滚,事务B再次读取id=1
的记录,发现和上一次读取到的数据不一致,这就是脏读。
可见,在Read Uncommitted隔离级别下,一个事务可能读取到另一个事务更新但未提交的数据,这个数据有可能是脏数据。
https://www.liaoxuefeng.com/wiki/1177760294764384/1219071817284064