在这之前介绍了mysql隔离级别最低的一种事务级别 Read Uncommitted
在Read Committed隔离级别下,一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。不可重复读是指,在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。
但同时,这种隔离级别也避免了出现脏读。
我们来测试一下,首先准备一个有数据的student表:
然后,分别开启两个MySQL客户端连接,按顺序依次执行事务A和事务B:
时刻 | 事务A | 事务B |
---|---|---|
1 | SET TRANSACTION ISOLATION LEVEL READ COMMITTED; | SET TRANSACTION ISOLATION LEVEL READ COMMITTED; |
2 | BEGIN; | BEGIN; |
3 | SELECT * FROM student; | |
4 | UPDATE student SET name = '小王' WHERE id = 1; | |
5 | SELECT * FROM student; | |
6 | COMMIT; | |
7 | SELECT * FROM student; | |
8 | COMMIT; |
当事务B第一次执行第3步的查询时,得到的结果是 张三 ,随后,事务A在第4步更新了这条记录没有提交,事务B在第5步再次执行同样的查询时,得到的结果还是 张三 ,事务A在第6步提交事务后,事务B在第7步再次查询,得到的结果还是 小王 。因此,在Read Committed隔离级别下,事务不可重复读同一条记录,因为很可能读到的结果不一致,但同时也避免了脏读。