Mysql事物的隔離性

說到mysql你就會想到關係型數據庫的ACID四大特性,今天我想詳細說說mysql事物的隔離性。那麼數據庫事物爲什麼要有隔離性?四種隔離級別有什麼作用?

1. 多個事物環境下存在的問題

在併發環境下,多個數據庫事務同時對資源進行操作會產生一些問題,你可能已經耳聞過髒讀、不可重複讀、幻讀。下面舉例說明他們是怎麼產生的。

髒讀,場景1:事物2修改一條數據,未提交,此時事物1獲取該條數據,然後事物2回滾。

可重複讀,場景2 

幻讀, 場景3

上面三種場景帶來的問題分別是髒讀,可重複讀,和幻讀。

髒讀:是指一個事務中訪問到了另外一個事務未提交的數據。例如事務2的未提交的數據被事務1讀走,如果事務2失敗回滾,會導致事務1所讀取的的數據是錯誤的。

可重複讀:是指在一個事務內根據同一個條件對行記錄進行多次查詢,但是搜出來的結果卻不一致。比如事務1中兩處讀取id=1的值。在第一讀的時候,name是小明,然後事務2就把name的數據改成 小紅,事務1再讀一次,結果就發現,name竟然就變成小紅了,造成事務1數據兩次讀取數據不一致。

幻讀:指同一個事務內多次查詢返回的結果集不一樣(比如增加了或者減少了行記錄)。

2. 四種事務的隔離級別

爲了解決以上問題數據庫提出了四種隔離級別:

(1)read uncommited:是最低的事務隔離級別,它允許另外一個事務可以看到這個事務未提交的數據。
(2)read commited:保證一個事物提交後才能被另外一個事務讀取。另外一個事務不能讀取該事物未提交的數據。
(3)repeatable read:這種事務隔離級別可以防止髒讀,不可重複讀。但是可能會出現幻象讀。它除了保證一個事務不能被另外一個事務讀取未提交的數據之外還避免了以下情況產生(不可重複讀)。
(4)serializable:這是花費最高代價但最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀之外,還避免了幻象讀
 

 

 

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