事務的特性以及隔離級別

一、事務的四大特性:

1.原子性(Atomicity):事務操作的集合是一個整體,不可能出現一部分成功,一部分失敗。

2.一致性(Consistency):一個事務執行之前和執行之後,數據庫都必須處於一致性狀態。舉例:A有1000元,B有0元,A、B此時共有1000元;接下來A借B 500元,此時A有500元,B有500元,A、B共有1000元,前後總錢數保持一致性。

3.隔離性(Isolation):彼此並行的事務,相互之間不能干擾。

4.持久性(Durability):事務一旦被提交,對數據庫的影響時永久性的。

二、並行的事務可能引發的問題:

爲什麼要有事務的隔離級別?如果並行的事務,不去考慮它的隔離性,會引發很多問題,比如數據的髒讀不可重複讀幻讀,而事務的隔離級別就是爲了解決這些問題。那麼什麼是髒讀、不可重複讀、幻讀呢?這裏先簡單說一下它的定義,具體細節展示與事務的隔離級別一同說明。 

1.髒讀:一個事務讀取到另一個事務未提交的數據。   

2.不可重複讀:在同一個事務中,重複執行相同的sql,查詢到的結果卻不相同。

3.幻讀:當某個事務讀取範圍內的數據時,另一個事務在該範圍內插入數據,之前的事務再次讀取範圍內的數據時,會引發幻讀。解釋一下:例如在一個事務A中,執行查詢,得到的結果集是10條,此時另一個事務B恰好執行了插入操作,事務A再次去查詢的時候,卻發現結果集有11條,貌似出現幻覺。                                           

三、事務的隔離級別:

事務的隔離級別大致分爲四個等級,Read uncommitted(讀未提交)Read committed(讀已提交)Repeatable read(可重複讀)Serializable(串行化),接下來對這四個隔離級別進行解釋,並且說明他們分別解決了什麼樣的問題?(髒讀、不可重複讀、幻讀)

1.Read uncommitted

該隔離級別在字面上的意思就是讀取未提交,如果將數據庫的隔離級別設爲此,就可能引發髒讀、不可重複讀、幻讀的問題。接下來就模擬一下數據庫將隔離級別設爲此等級,所引發的髒讀。首先打開2個cmd窗口,登陸mysql數據庫,這兩個窗口的作用是一個模擬事務A,一個模擬事務B。然後將當前兩個會話的隔離級別設置爲Read uncommitted,具體操作:

(1)A窗口首先設置隔離級別爲Read uncommitted,然後開啓事務,並且查詢表bank_account

(2)B窗口同樣設置隔離級別爲Read uncommitted,開啓事務,做money的更新操作,但是並沒有提交事務

(3)此時A窗口模擬的事務再次查詢表,發現錢數少了,讀到了B還沒有提交的事務,數據出現髒讀

總結:Read uncommitted(讀未提交),這一隔離級別較低,會引發髒讀問題,實際開發過程中要保證數據的正確性和安全性,一般不會使用此隔離級別。

2.Read committed

字面意思,讀到已經提交的數據。這一隔離級別的等級較Read uncommitted要高,不會引發髒讀的問題,但是它會引發數據的不可重複讀問題,具體解釋直接用例子來說明。

(1)A窗口設置隔離級別爲Read committed,開啓事務,查詢表

(2)B窗口設置隔離級別爲Read committed,開啓事務,做money的更新操作,注意仍然沒有提交事務

(3)A窗口再次查詢表,發現錢數還是1000,並沒有讀取到B窗口未提交的數據,說明該隔離級別解決了髒讀的問題

(4)那麼不可重複讀的問題是怎麼出現的呢?接下來讓B窗口提交事務,A再次查詢表的時候就會發現,money的錢數減少了,同樣的sql,查詢的結果卻不同,這就出現了不可重複讀的問題

總結:Read committed(讀已提交),這一隔離級別雖然解決了髒讀的問題,但是卻避免不了不可重複讀的問題。

3.Repeatable read

字面意思,可重複讀。這也是mysql數據庫默認的事務隔離級別,可以使用如下的sql語句查看當前數據庫的默認隔離級別:select @@tx_isolation;要說的是,這一隔離級別能夠解決髒讀、不可重複讀的問題,但是無法解決幻讀的問題。具體還是使用例子說明。

(1)A窗口設置隔離級別爲Repeatable read,開啓事務,查詢表

(2)B窗口設置隔離級別爲Repeatable read,開始事務,做money的更新操作,並且提交了事務(注意)

(3)A窗口再次查詢表,發現兩次查詢的結果相同,沒有出現查詢結果不一致發的問題。說明Repeatable read這一隔離級別避免了不可重複讀。

(4)只有當A也提交事務,才能夠看見數據的變化

(5)以上例子只能夠說明Repeatable read(可重複讀)這一隔離級別能夠解決髒讀、幻讀的問題,但是卻不能夠很好的模擬幻讀的出現,那麼幻讀是什麼樣子呢?接下來在上面的基礎之上模擬一下。讓B窗口新增一條數據,並提交它的事務

(6)A窗口再次查詢,發現原來總共兩條數據,突然變成了三條,幻讀出現

4.Serializable

這一隔離級別是安全性最高的,能夠解決髒讀、不可重讀讀、幻讀等問題,但是過於安全,性能方面就略差一點。

四、圖解隔離級別以及對應解決的問題

待補充。。。

 

本文參考博客:https://www.cnblogs.com/snsdzjlz320/p/5761387.html

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