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(InnoDB)事務隔離級別(REPEATABLE READ) 與 鎖,MVCCMySqlMVC
- 如何理解mysql 的事務隔離級別 repeatable readMySql
- MySQL的repeatable readMySql
- read repeatable&read committed 區別MIT
- MySQL 5.5 隔離級別測試MySql
- read committed 和 repeatable read 上鎖的區別MIT
- MySQL資料庫中的四種隔離級別MySql資料庫
- SQL Server 2005的read committed snapshot隔離級別SQLServerMIT
- 【MySQL】MySQL的四種事務隔離級別MySql
- 測試一下MySQL四種隔離級別都做了什麼MySql
- 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
- 在SQL Server 2005資料庫中設定read committed snapshot隔離級別SQLServer資料庫MIT
- MySQL 事務隔離級別MySql
- MySQL入門--隔離級別MySql
- MySQL設定隔離級別MySql
- MySQL事務隔離級別MySql
- [Mysql]事務/隔離級別MySql
- Mysql事務隔離級別與鎖機制MySql
- 淺析MySQL InnoDB的隔離級別MySql
- Mysql資料庫的隔離級別MySql資料庫
- 理解mysql的事務隔離級別MySql
- read name 和 read 在 Bash 中的區別
- [Mysql]——通過例子理解事務的4種隔離級別MySql
- read by other session 測試Session
- 理解MySQL事務隔離級別MySql
- mysql修改事務隔離級別MySql
- MySQL事務的隔離級別與併發問題MySql