在默认的隔离级别下一致读是指InnoDB在多版本控制中在事务的首次读时产生一个镜像,在首次读时间点之前其他事务提交的修改可以读取到,而首次读时间点之后其他事务提交的修改或者是未提交的修改都读取不到
唯一例外的情况是在首次读时间点之前的本事务未提交的修改数据可以读取到
在读取提交数据隔离级别下,一致读的每个读取操作都会有自己的镜像
一致读操作不会施加任何的锁,所以就不会阻止其他事务的修改动作
在下面的例子中,链接A对链接B所做的修改,只有在它的事务和链接B的事务都提交的情况下才能看到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Session A Session B SET autocommit=0; SET autocommit=0; SELECT * FROM t; empty set INSERT INTO t VALUES (1, 2); SELECT * FROM t; empty set COMMIT; SELECT * FROM t; empty set COMMIT; SELECT * FROM t; --------------------- | 1 | 2 | ---------------------
首次读时间点之前的本事务未提交的修改数据可以读取到在读取提交数据隔离级别下,一致读的每个读取操作都会有自己的镜像
例 一直读每个读取操作前自己的镜像
+ View Code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
session1: 开启一个事务 ,进行修改数据操作
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> update temp set name='aaa' ;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
session2:开启事务
commitmysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
session1: 进行提交修改数据为aa的事务
commit;
session2: 还是本事务没有提交的镜像数据
mysql> select * from temp;
+----+---------+
| id | name |
+----+---------+
| 1 | 1111111 |
| 2 | 1111111 |
| 3 | 1111111 |
| 4 | 1111111 |
+----+---------+
session2:在进行数据修改
mysql> update temp set name='bbb';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> commit;
Query OK, 0 rows affected (0.01 sec)
session1:再进行查看,
mysql> select * from temp;
+----+---------+
| id | name |
+----+---------+
| 1 | 1111111 |
| 2 | 1111111 |
| 3 | 1111111 |
| 4 | 1111111 |
+----+---------+
然后提交session2的事务:
mysql> select * from temp;
+----+------+
| id | name |
+----+------+
| 1 | bbb |
| 2 | bbb |
| 3 | bbb |
| 4 | bbb |
+----+------+