摘要:低的隔離級一般支持更高的并發處理,并擁有更低的系統開銷。隔離級別由低到高。讀取未提交內容在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。在這個級別,可能導致大量的超時現象和鎖競爭。
開發工作中我們會使用到事務,那你們知道事務又分哪幾種嗎?
MYSQL標準定義了4類隔離級別,用來限定事務內外的哪些改變是可見的,哪些是不可見的。
低的隔離級一般支持更高的并發處理,并擁有更低的系統開銷。
隔離級別由低到高:Read Uncommitted < Read Committed < Repeatable Read < Serializable。
Read Uncommitted(讀取未提交內容)
在該隔離級別,所有事務都可以看到其他未提交(commit)事務的執行結果。
本隔離級別很少用于實際應用,因為它的性能也不比其他級別好多少。
讀取未提交的數據,也被稱之為臟讀(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(讀取提交內容)
這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。
它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。
這種隔離級別 也支持所謂的不可重復讀(NonrepeatableRead),因為同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一 select 可能返回不同結果。
[窗口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的默認事務隔離級別,它確保同一事務的多個實例在并發讀取數據時,會看到同樣的數據行。
不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。
簡單的說,幻讀指當用戶讀取某一范圍的數據行時,另一個事務又在該范圍內插入了新行,當用戶再讀取該范圍的數據行時,會發現有新的“幻影” 行。
InnoDB和Falcon存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。
[窗口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(序列化執行)
這是最高的隔離級別,它通過強制事務排序,使之不可能相互沖突,從而解決幻讀問題。
簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
[窗口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)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21851.html
摘要:客戶端設置手動提交,修改事務隔離級別為,并且開啟事務一定要在開啟事務前修改事務的隔離級別,不然當前還是保持著原來的事務隔離級別,直到當前事務提交。 本質 隔離級別定義了數據庫系統中一個操作產生的影響什么時候以哪種方式可以對其他并發操作可見,隔離性是事務的ACID中的一個重要屬性,核心是對鎖的操作。 鎖 從數據庫系統角度 共享鎖(Shared Lock) 讀鎖,保證數據只能讀取,不能被修...
閱讀 2719·2021-11-17 17:01
閱讀 2097·2021-09-28 09:35
閱讀 3603·2021-09-01 11:04
閱讀 867·2020-06-22 14:41
閱讀 2987·2019-08-30 15:55
閱讀 2599·2019-08-30 15:43
閱讀 2324·2019-08-26 13:54
閱讀 2521·2019-08-26 13:48