摘要:低的隔離級一般支持更高的并發(fā)處理,并擁有更低的系統(tǒng)開銷。隔離級別由低到高。讀取未提交內(nèi)容在該隔離級別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果。在這個級別,可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭。
開發(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é)果。
本隔離級別很少用于實際應(yīng)用,因為它的性能也不比其他級別好多少。
讀取未提交的數(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),因為同一事務(wù)的其他實例在該實例處理其間可能會有新的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ù)的多個實例在并發(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)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/21851.html
摘要:客戶端設(shè)置手動提交,修改事務(wù)隔離級別為,并且開啟事務(wù)一定要在開啟事務(wù)前修改事務(wù)的隔離級別,不然當(dāng)前還是保持著原來的事務(wù)隔離級別,直到當(dāng)前事務(wù)提交。 本質(zhì) 隔離級別定義了數(shù)據(jù)庫系統(tǒng)中一個操作產(chǎn)生的影響什么時候以哪種方式可以對其他并發(fā)操作可見,隔離性是事務(wù)的ACID中的一個重要屬性,核心是對鎖的操作。 鎖 從數(shù)據(jù)庫系統(tǒng)角度 共享鎖(Shared Lock) 讀鎖,保證數(shù)據(jù)只能讀取,不能被修...
閱讀 2793·2021-11-17 17:01
閱讀 2177·2021-09-28 09:35
閱讀 3691·2021-09-01 11:04
閱讀 996·2020-06-22 14:41
閱讀 3039·2019-08-30 15:55
閱讀 2685·2019-08-30 15:43
閱讀 2400·2019-08-26 13:54
閱讀 2569·2019-08-26 13:48