mysql中read commited與repeatable read兩種隔離級別的測試
兩個事物,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級別,在事物進行過程中,讀取到的資料可能是不一致的。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何理解mysql 的事務隔離級別 repeatable readMySql
- MySQL的repeatable readMySql
- MySQL資料庫事務各隔離級別加鎖情況--read uncommittMySql資料庫MIT
- 面試問爛的 MySQL 四種隔離級別面試MySql
- MySQL資料庫中的四種隔離級別MySql資料庫
- MySQL 的四種事務隔離級別MySql
- 測試一下MySQL四種隔離級別都做了什麼MySql
- Mysql 四種事務隔離級別MySql
- MySQL的隔離級別MySql
- MySQL資料庫事務各隔離級別加鎖情況--Repeatable ReaMySql資料庫
- Mysql鎖與事務隔離級別MySql
- MySQL事務的隔離級別MySql
- MySQL 的隔離級別 自理解MySql
- MySQL的事務隔離級別MySql
- MySQL事務隔離級別MySql
- MySQL 事務隔離級別MySql
- [Mysql]事務/隔離級別MySql
- 事務的四種隔離級別
- Mysql事務隔離級別與鎖機制MySql
- 淺析MySQL InnoDB的隔離級別MySql
- Mysql資料庫的隔離級別MySql資料庫
- 理解mysql的事務隔離級別MySql
- 事務四種隔離級別
- 理解MySQL事務隔離級別MySql
- MySQL事務的隔離級別與併發問題MySql
- 資料庫的四種隔離級別資料庫
- 理解事務的4種隔離級別
- (轉)事務的四種隔離級別
- MySQL 事務的隔離級別初窺MySql
- 等待事件db file sequential read、db file scattered read和direct read的區別事件
- 事務的隔離級別與MVCCMVC
- MySQL事務隔離級別和MVCCMySqlMVC
- 啥是 MySQL 事務隔離級別?MySql
- mysql如何修改事務隔離級別MySql
- MySQL之事務隔離級別和MVCCMySqlMVC
- mysql事務隔離級別和鎖MySql
- 還原面試現場-ACID與隔離級別面試
- 帶你真正理解MySQL資料庫的四種隔離級別!MySql資料庫