mysql中read commited與repeatable read兩種隔離級別的測試

lsq_008發表於2018-04-23
兩個事物,A與B

1. 先看read committed級別的情況:

--A事物
mysql> set session transaction isolation level read committed;
Query OK, 0 rows affected (0.00 sec)

mysql> set autocommit = 0;
Query OK, 0 rows affected (0.01 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+------+------+
| id   | comm |
+------+------+
|    1 | aaa  |
+------+------+
1 row in set (0.00 sec)

--B事物

mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test set comm = 'bbb' where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

--A事物此時查詢表test,此時B事物未提交,因此讀到的仍然是舊的資料

mysql> select * from test;
+------+------+
| id   | comm |
+------+------+
|    1 | aaa  |
+------+------+
1 row in set (0.00 sec)

--B事物提交
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

--A事物再次查詢,資料已發生改變。

mysql> select * from test;
+------+------+
| id   | comm |
+------+------+
|    1 | bbb  |
+------+------+
1 row in set (0.00 sec)

可見,在 read committed級別,顧名思義,A事物在事物進行過程中,讀取不到B事物未提交的資料,但是可以讀取到B事物已經提交的資料修改

2.再看repeatable read級別

--A事物:

mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> set session transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test;
+------+------+
| id   | comm |
+------+------+
|    1 | aaa  |
+------+------+
1 row in set (0.00 sec)

--B事物:
mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> update test set comm = 'bbb' where id = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0


--A事物此時查詢表test,此時B事物未提交,因此讀到的仍然是舊的資料
mysql> select * from test;
+------+------+
| id   | comm |
+------+------+
|    1 | aaa  |
+------+------+
1 row in set (0.00 sec)

--B事物提交
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

--A事物再次查詢,發現資料未發生改變
mysql> select * from test;
+------+------+
| id   | comm |
+------+------+
|    1 | aaa  |
+------+------+
1 row in set (0.00 sec)

可見,在 repeatable read 級別,顧名思義,A事物在事物進行過程中,是不能讀取到B事物未提交和已提交的資料修改。

對於repeatable read 級別,事物只能讀取到事物開始時的資料,因此在事物進行過程中讀取到的資料時一致的,而對於read commited級別,在事物進行過程中,讀取到的資料可能是不一致的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10972173/viewspace-2153205/,如需轉載,請註明出處,否則將追究法律責任。

相關文章