淺談MySQL中的事務隔離級別(r11筆記第86天)
之前寫了一篇淺談事務(一),算是對事務的一個基本認識,今天來簡單總結一下事務的隔離級別,雖然是老掉牙的知識點,重溫一下還是值得的。
在MySQL中基本有這兩種事務隔離級別的設定,預設的RR(Repeatable-Read)和實際中常見的RC(Read-Committed)。兩者區別是什麼,怎麼正確理解,用幾個SQL語句就能說明白,就用簡單的實驗來說明白。
我們開始吧。
首先建立一個測試表test,插入一些資料。
create table test( id int primary key,name varchar(30),memo varchar(30));
insert into test values(1,'name1','aaaa'),(2,'name2','aaaa'),(3,'name3','aaaa'),(4,'name4','aaaa'),(5,'name5','aaaa'); 很多情況下,我們會把隔離級別從預設的RR修改為RC,這也是其它很多資料庫預設的事務隔離級別。
我們開啟兩個視窗,來對比關聯測試。
RC模式下的測試
1
視窗1
>show variables like 'tx_isolation';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| tx_isolation | READ-COMMITTED |
+---------------+----------------+
1 row in set (0.01 sec)
>begin; --開啟事務
>select *from test; --檢視資料
+----+-------+------+
| id | name | memo |
+----+-------+------+
| 1 | name1 | aaaa |
| 2 | name2 | aaaa |
| 3 | name3 | aaaa |
| 4 | name4 | aaaa |
| 5 | name5 | aaaa |
+----+-------+------+
5 rows in set (0.00 sec)
2
視窗2
begin; --開啟事務
>update test set name='aaaaa' where id=2; --修改一條記錄
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0
>commit; --提交事務
Query OK, 0 rows affected (0.01 sec)
1
視窗1
>select *from test; --檢視視窗1中的資料,就會發現原來視窗的資料發生了變化,這是不可重複讀的一個典型例子。
+----+-------+------+
| id | name | memo |
+----+-------+------+
| 1 | name1 | aaaa |
| 2 | aaaaa | aaaa |
| 3 | name3 | aaaa |
| 4 | name4 | aaaa |
| 5 | name5 | aaaa |
+----+-------+------+
5 rows in set (0.00 sec)
再來看看RR這個隔離級別,其實有了上面的測試,就相對有底了。這是MySQL預設的隔離級別,會出現幻讀的情況。
1
視窗1
首先修改隔離級別從RC到RR
>set global transaction isolation level repeatable read;
Query OK, 0 rows affected (0.00 sec)
?檢視事務隔離級別。
>show variables like 'tx_isolation';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| tx_isolation | REPEATABLE-READ |
+---------------+-----------------+
1 row in set (0.00 sec)
>begin; --開啟事務
>select *from test; --檢視錶test的資料。
+----+-------+------+
| id | name | memo |
+----+-------+------+
| 1 | name1 | aaaa |
| 2 | aaaaa | aaaa |
| 3 | name3 | aaaa |
| 4 | name4 | aaaa |
| 5 | name5 | aaaa |
+----+-------+------+
5 rows in set (0.00 sec)
2
視窗2
>begin; --開啟事務
>update test set name='RR_test'; --修改表test的資料,所有記錄都發生變化。
Query OK, 5 rows affected (0.01 sec)
Rows matched: 5 Changed: 5 Warnings: 0
>commit; --提交事務
Query OK, 0 rows affected (0.00 sec)
1
視窗1
>select *from test; --在RR模式下,視窗1中的事務因為還沒有提交,看到的還是原來的資料。
+----+-------+------+
| id | name | memo |
+----+-------+------+
| 1 | name1 | aaaa |
| 2 | aaaaa | aaaa |
| 3 | name3 | aaaa |
| 4 | name4 | aaaa |
| 5 | name5 | aaaa |
+----+-------+------+
5 rows in set (0.00 sec)
>commit; --我們提交視窗1的事務
Query OK, 0 rows affected (0.00 sec)
>select *from test; --再次檢視資料就發生了變化,實際上視窗1中沒有任何的DMl操作。
+----+---------+------+
| id | name | memo |
+----+---------+------+
| 1 | RR_test | aaaa |
| 2 | RR_test | aaaa |
| 3 | RR_test | aaaa |
| 4 | RR_test | aaaa |
| 5 | RR_test | aaaa |
+----+---------+------+
5 rows in set (0.00 sec)
小結
用一個通俗的例子來說明,比如加工資,領導叫你去談話,然後給你加薪10%,RC的情況就是當月就立即生效;而RR的情況是,領導叫你去談話了,結果過了兩個月你看到工資還是沒變,到了第3個月,把前兩個月加薪的部分也補給你了。大概就是這樣的意思。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2134294/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 事務隔離級別MySql
- MySQL事務隔離級別MySql
- [Mysql]事務/隔離級別MySql
- MySQL事務的隔離級別MySql
- MySQL的事務隔離級別MySql
- 理解mysql的事務隔離級別MySql
- 理解MySQL事務隔離級別MySql
- mysql修改事務隔離級別MySql
- 事務隔離級別讀書筆記分享筆記
- 【MySQL】MySQL的四種事務隔離級別MySql
- MySQL 的四種事務隔離級別MySql
- MySQL 事務的隔離級別初窺MySql
- MySQL的四種事務隔離級別MySql
- MySQL事務隔離級別和MVCCMySqlMVC
- mysql如何修改事務隔離級別MySql
- mysql事務隔離級別和鎖MySql
- 啥是 MySQL 事務隔離級別?MySql
- Mysql 四種事務隔離級別MySql
- Mysql鎖與事務隔離級別MySql
- MySQL事務隔離級別詳解MySql
- 徹底搞懂 MySQL 事務的隔離級別MySql
- MySQL的事務隔離級別是什麼?MySql
- MySQL的事務處理及隔離級別MySql
- MySQL事務隔離級別的實現原理MySql
- 【mysql】官方的SQL事務隔離級別文件MySql
- MySQL 事務隔離級別實現原理MySql
- 深入淺出MYSQL的事務隔離MySql
- PostgreSQL事務隔離級別SQL
- 事務、特性、隔離級別
- MySQL InnoDB中的事務隔離級別和鎖的關係MySql
- MySQL 事務隔離級別解析和實戰MySql
- 四個案例看懂 MySQL 事務隔離級別MySql
- Mysql事務隔離級別與鎖機制MySql
- 深入理解MySQL中事務隔離級別的實現原理MySql
- 淺析MySQL InnoDB的隔離級別MySql
- 事務系統的隔離級別
- SQL Server事務的隔離級別SQLServer
- Oracle-事務隔離級別Oracle