Mysql事務(wù)的隔離級別怎么分的

本篇內(nèi)容主要講解“MySQL事務(wù)的隔離級別怎么分的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Mysql事務(wù)的隔離級別怎么分的”吧!

10年積累的成都做網(wǎng)站、成都網(wǎng)站設(shè)計、成都外貿(mào)網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有信豐免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

Mysql事務(wù)的隔離級別怎么分的

開發(fā)工作中我們會使用到事務(wù),那你們知道事務(wù)又分哪幾種嗎?

MYSQL標(biāo)準(zhǔn)定義了4類隔離級別,用來限定事務(wù)內(nèi)外的哪些改變是可見的,哪些是不可見的。

低的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。

隔離級別由低到高:Read Uncommitted < Read Committed < Repeatable Read < Serializable。

Read Uncommitted(讀取未提交內(nèi)容)

在該隔離級別,所有事務(wù)都可以看到其他未提交(commit)事務(wù)的執(zhí)行結(jié)果。

本隔離級別很少用于實(shí)際應(yīng)用,因?yàn)樗男阅芤膊槐绕渌墑e好多少。

讀取未提交的數(shù)據(jù),也被稱之為臟讀(Dirty Read)。

[窗口A]:

mysql> set GLOBAL tx_isolation='READ-UNCOMMITTED';

Query OK, 0 rows affected (0.00 sec)

mysql> quit;

Bye

[root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登錄)

mysql> SELECT @@tx_isolation;

+------------------+

| @@tx_isolation   |

+------------------+

| READ-UNCOMMITTED |

+------------------+

1 row in set (0.00 sec)

mysql> use test;

Database changed

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from user;

+----+------+

| id | name |

+----+------+

|  1 | a    |

|  2 | b    |

+----+------+

2 rows in set (0.00 sec)

[窗口B]:

mysql> select @@tx_isolation;

+------------------+

| @@tx_isolation   |

+------------------+

| READ-UNCOMMITTED |

+------------------+

1 row in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into test.user values (3, 'c');

Query OK, 1 row affected (0.00 sec)

mysql> select * from user;

+----+------+

| id | name |

+----+------+

|  1 | a    |

|  2 | b    |

|  3 | c    |

+----+------+

3 rows in set (0.00 sec)

//目前為止,窗口B并未commit;

[窗口A]:

mysql> select * from user ;

+----+------+

| id | name |

+----+------+

|  1 | a    |

|  2 | b    |

|  3 | c    |

+----+------+

3 rows in set (0.00 sec)

Read Committed(讀取提交內(nèi)容)

這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別(但不是MySQL默認(rèn)的)。

它滿足了隔離的簡單定義:一個事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變。

這種隔離級別 也支持所謂的不可重復(fù)讀(NonrepeatableRead),因?yàn)橥皇聞?wù)的其他實(shí)例在該實(shí)例處理其間可能會有新的commit,所以同一 select 可能返回不同結(jié)果。

[窗口A]:

mysql> SET GLOBAL tx_isolation='READ-COMMITTED';

Query OK, 0 rows affected (0.00 sec)

mysql> quit;

Bye

[root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登錄)

mysql> SELECT @@tx_isolation;

+----------------+

| @@tx_isolation |

+----------------+

| READ-COMMITTED |

+----------------+

1 row in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  1 | a    |

|  2 | b    |

+----+------+

2 rows in set (0.00 sec)

[窗口B]:

mysql> SELECT @@tx_isolation;

+----------------+

| @@tx_isolation |

+----------------+

| READ-COMMITTED |

+----------------+

1 row in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  1 | a    |

|  2 | b    |

+----+------+

2 rows in set (0.00 sec)

mysql> delete from test.user where id=1;

Query OK, 1 row affected (0.00 sec)

mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  2 | b    |

+----+------+

1 row in set (0.00 sec)

[窗口A]:

mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  1 | a    |

|  2 | b    |

+----+------+

2 rows in set (0.00 sec)

[窗口B]:

mysql> commit;

Query OK, 0 rows affected (0.02 sec)

[窗口A]:

mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  2 | b    |

+----+------+

1 row in set (0.00 sec)

Repeatable Read(可重讀)

這是MySQL的默認(rèn)事務(wù)隔離級別,它確保同一事務(wù)的多個實(shí)例在并發(fā)讀取數(shù)據(jù)時,會看到同樣的數(shù)據(jù)行。

不過理論上,這會導(dǎo)致另一個棘手的問題:幻讀 (Phantom Read)。

簡單的說,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時,另一個事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時,會發(fā)現(xiàn)有新的“幻影” 行。

InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機(jī)制解決了該問題。

[窗口A]:

mysql> SET GLOBAL tx_isolation='REPEATABLE-READ';

Query OK, 0 rows affected (0.00 sec)

mysql> quit;

Bye

[root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登錄)

mysql> SELECT @@tx_isolation;

+-----------------+

| @@tx_isolation  |

+-----------------+

| REPEATABLE-READ |

+-----------------+

1 row in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

[窗口B]:

mysql> quit;

Bye

[root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登錄)

mysql> SELECT @@tx_isolation;

+-----------------+

| @@tx_isolation  |

+-----------------+

| REPEATABLE-READ |

+-----------------+

1 row in set (0.00 sec)

mysql> insert into test.user values (4, 'd');

Query OK, 1 row affected (0.00 sec)

mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  2 | b    |

|  4 | d    |

+----+------+

2 rows in set (0.00 sec)

[窗口A]:

mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  2 | b    |

+----+------+

1 rows in set (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  2 | b    |

|  4 | d    |

+----+------+

2 rows in set (0.00 sec)

Serializable(序列化執(zhí)行)

這是最高的隔離級別,它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。

簡言之,它是在每個讀的數(shù)據(jù)行上加上共享鎖。在這個級別,可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭。 

[窗口A]:

mysql> SET GLOBAL tx_isolation='SERIALIZABLE';

Query OK, 0 rows affected (0.00 sec)

mysql> quit;

Bye

[root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登錄)

mysql> SELECT @@tx_isolation;

+----------------+

| @@tx_isolation |

+----------------+

| SERIALIZABLE   |

+----------------+

1 row in set (0.00 sec)

mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  2 | b    |

|  4 | d    |

+----+------+

2 rows in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into test.user values (5, 'e');

Query OK, 1 row affected (0.00 sec)

[窗口B]:

mysql> quit;

Bye

[root@vagrant-centos65 ~]# mysql -uroot -pxxxx(重新登錄)

mysql> SELECT @@tx_isolation;

+----------------+

| @@tx_isolation |

+----------------+

| SERIALIZABLE   |

+----------------+

1 row in set (0.00 sec)

mysql> select * from test.user;

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

[窗口A]:

mysql> commit;

Query OK, 0 rows affected (0.01 sec)

[窗口B]:

mysql> mysql> select * from test.user;

+----+------+

| id | name |

+----+------+

|  2 | b    |

|  4 | d    |

|  5 | e    |

+----+------+

3 rows in set (0.00 sec)


到此,相信大家對“Mysql事務(wù)的隔離級別怎么分的”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

網(wǎng)站欄目:Mysql事務(wù)的隔離級別怎么分的
網(wǎng)站URL:http://muchs.cn/article12/iheogc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、品牌網(wǎng)站制作、微信公眾號定制網(wǎng)站、電子商務(wù)、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)