可重複讀隔離級別特性:
1.當前事務能看到的數據版本是事務內第一次執行查詢或修改開始時的靜態版本。無法看到其他事務對數據的修改(無論提交與否),從而避免了事務內多次讀的數據版本不一樣的情況。只有當前事務對數據的修改纔對自己可見。
2.對於當前事務修改過的表(insert、update或delete),在當前事務提交前,其他事務對這些表進行update、delete或破壞限制的insert時需要等待當前事務提交,當前事務提交後,其他事務的update和delete會繼續執行,而破壞限制的insert會失敗。
爲什麼可重複讀需要給表級別加update和delete鎖?
repeatable read隔離級別下 在當前會話開啓一個事務,然後對T1表執行一次查詢,相當於創建了一個數據的靜態版本
Current session:
mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | AAA |
| 2 | BBB |
| 3 | CCC |
| 4 | DDD |
| 5 | FFF |
+----+------+
5 rows in set (0.00 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | AAA |
| 2 | BBB |
| 3 | CCC |
| 4 | DDD |
| 5 | FFF |
+----+------+
5 rows in set (0.00 sec)
然後在另一個會話對T1表的內容進行修改並提交(自動提交,不必顯式開啓事務)
Other session:
mysql> update t1 set name='AAAA' where id=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | AAAA |
| 2 | BBB |
| 3 | CCC |
| 4 | DDD |
| 5 | FFF |
+----+------+
5 rows in set (0.00 sec)
再回到當前會話,查看T1表內容,數據並沒有發生變化
Current session:
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | AAA |
| 2 | BBB |
| 3 | CCC |
| 4 | DDD |
| 5 | FFF |
+----+------+
5 rows in set (0.00 sec)
但當我們按照當前查詢到的內容對T1表進行修改時,卻出現了奇怪的現象
Current session:
mysql> update t1 set name='AAAAA' where name='AAA';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | AAA |
| 2 | BBB |
| 3 | CCC |
| 4 | DDD |
| 5 | FFF |
+----+------+
5 rows in set (0.00 sec)
mysql> update t1 set name='AAAAA' where name='AAAA';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t1;
+----+------+
| id | name |
+----+------+
| 1 | AAAAA |
| 2 | BBB |
| 3 | CCC |
| 4 | DDD |
| 5 | FFF |
+----+------+
5 rows in set (0.00 sec)
從上面的實驗可以看出,對T1表進行update的時候,並沒有按照最開始執行查詢的時候的數據靜態版本中的內容來更新,而是按照表中實際數據內容來更新,也就是說,只有select操作纔是嚴格意義上的可重複的,涉及表數據修改的操作不具有“可重複性”,是表在第一次被修改後,纔對表施加了表級別的update和delete鎖,從而實現的後續對該表修改的“可重複性”。