MySQL中四種事務隔離級別

孫玄:一切拋開業務的架構設計都是耍流氓 —58同城系統架構師
一切拋開業務的面試都是耍流氓

1、概念

事務: 在某些業務需求中,一系列操作必須全部執行,而不能僅執行一部分。
比如在執行多條SQL時,需要兩個SQL同時執行成功才能更新表數據,事務就是爲了解決這個問題。
比如在分享功能業務中,需要同時更新積分記錄表和客戶信息表;
隱式事務:對於單條SQL語句,數據庫系統自動將其作爲一個事務來執行;
顯式事務:多條SQL語句作爲一個事務來執行。
MysqlInnoDB\color{#FF0000}{注意:Mysql事務要求必須是InnoDB存儲引擎}
具體實例:

CREATE TABLE 
bank(NAME VARCHAR(20),money DECIMAL(5,1))
ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO bank VALUES('shaotuo',1000),('laohu',5000);
START TRANSACTION;	 //開啓事務
UPDATE bank SET money=money+500 WHERE NAME='shaotuo';	//SQL1
UPDATE bank SET moey=money-500 WHERE NAME='laohu';	//SQL2
ROLLBACK;	//回滾
COMMIT; //兩個都成功後執行commit(只要不執行commit,sql語句不會對真實的數據庫造成影響)

如果不使用事務時:當SQL2執行失敗時無法恢復到事務開啓前的狀態,所以需要加入事務,避免產生髒數據。

2、事務的ACID特性

1、原子性(Atomicity):將多條SQL看做原子進行執行,要麼全部執行成功,如果其中有失敗的SQL則全部回滾到事務開始前的狀態;
2、一致性(Consistency):事務完成後,所有數據的狀態都是一致的,即A賬戶只要減去了100,B賬戶則必定加上了100;
3、隔離性(Isolation):在該事務執行過程中,每個事務作出的修改是與其他事務完全隔離的,對外界沒有影響,比如第一條SQL執行的結果在第二條SQL中查詢不到,只有事務提交後其它事務纔可以查詢到最新的數據;
4、持久性(Durability):事務完成後,對數據的改變會永久性的存儲起來,即使發生斷電宕機數據依然在。

3、事務的併發問題

對於兩個併發執行的事務,如果涉及到操作同一條記錄的SQL時候,可能會發生髒讀、不可重複讀和幻讀等問題。
1、髒讀:一個事務讀到另一個事務更新後但未提交的數據,如果另一個事務回滾,那麼當前事務讀到的數據就是髒數據,這就是髒讀(Dirty Read)。
2、不可重複讀:一個事務中兩條SQL讀同一數據,在第一條讀完第二條SQL還未開始讀時,如果另一個事務恰好修改了這個數據,那麼,在第一個事務中,兩次讀取的數據就可能不一致。
3、幻讀:在一個事務中,第一次查詢某條記錄發現沒有,但是當試圖更新這條不存在的記錄時,竟然能成功,並且再次讀取同一條記錄,它就神奇地出現了。
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

4、MySQL事務隔離級別

讀未提交:Read Uncommitted是隔離級別最低的一種事務級別。在這種隔離級別下,一個事務會讀到另一個事務更新後但未提交的數據,如果另一個事務回滾,那麼當前事務讀到的數據就是髒數據,這就是髒讀(Dirty Read)。
不可重複讀:Read-committed是指在一個事務內,多次讀同一數據,在這個事務還沒有結束時,如果另一個事務恰好修改了這個數據,那麼,在第一個事務中,兩次讀取的數據就可能不一致。
可重複讀:在Repeatable Read隔離級別下,一個事務可能會遇到幻讀(Phantom Read)的問題。
串行化:Serializable是最嚴格的隔離級別。在Serializable隔離級別下,所有事務按照次序依次執行,因此,髒讀、不可重複讀、幻讀都不會出現。
事務隔離級別 髒讀 不可重複讀 幻讀
讀未提交(read-uncommitted) 是 是 是
不可重複讀(read-committed) 否 是 是
可重複讀(repeatable-read) 否 否 是
串行化(serializable) 否 否 否

mysql默認的事務隔離級別爲repeatable-read
查看mysql默認的事務隔離級別:

SELECT @@tx_isolation;

設置當前事務模式爲未提交讀:

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

設置當前事務模式爲已提交讀:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

設置當前事務模式爲可重複讀:

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;

更多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章