国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

淺談MySQL中的事務隔離級別

2024-07-24 12:32:09
字體:
來源:轉載
供稿:網友
     之前寫了一篇淺談事務(一),算是對事務的一個基本認識,今天來簡單總結一下事務的隔離級別,雖然是老掉牙的知識點,重溫一下還是值得的。
 
    在MySQL中基本有這兩種事務隔離級別的設置,默認的RR(Repeatable-Read)和實際中常見的RC(Read-Committed)。兩者區(qū)別是什么,怎么正確理解,用幾個SQL語句就能說明白,就用簡單的實驗來說明白。
 
    我們開始吧。    
 
    首先創(chuàng)建一個測試表test,插入一些數(shù)據(jù)。
 
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,這也是其它很多數(shù)據(jù)庫默認的事務隔離級別。
 
我們打開兩個窗口,來對比關聯(lián)測試。
 
 
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;  --查看數(shù)據(jù)
+----+-------+------+
| 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中的數(shù)據(jù),就會發(fā)現(xiàn)原來窗口的數(shù)據(jù)發(fā)生了變化,這是不可重復讀的一個典型例子。
+----+-------+------+
| 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模式下的測試
再來看看RR這個隔離級別,其實有了上面的測試,就相對有底了。這是MySQL默認的隔離級別,會出現(xiàn)幻讀的情況。
 
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的數(shù)據(jù)。
+----+-------+------+
| 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的數(shù)據(jù),所有記錄都發(fā)生變化。
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中的事務因為還沒有提交,看到的還是原來的數(shù)據(jù)。
+----+-------+------+
| 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;  --再次查看數(shù)據(jù)就發(fā)生了變化,實際上窗口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個月,把前兩個月加薪的部分也補給你了。大概就是這樣的意思。

(編輯:武林網)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 塘沽区| 郧西县| 衢州市| 龙井市| 龙南县| 大宁县| 深圳市| 峨边| 民权县| 哈尔滨市| 白沙| 延吉市| 保山市| 准格尔旗| 西乌珠穆沁旗| 龙门县| 巴塘县| 桐柏县| 淮安市| 鞍山市| 射洪县| 油尖旺区| 白沙| 陕西省| 榆社县| 蒙阴县| 钟祥市| 岳普湖县| 东源县| 普兰店市| 二连浩特市| 柏乡县| 贡嘎县| 保靖县| 松滋市| 合作市| 肥乡县| 汪清县| 金溪县| 漯河市| 鄂伦春自治旗|