您好,登錄后才能下訂單哦!
這篇文章為大家帶來有關事務的四大特性和隔離級別的介紹。文章不僅介紹事務的四大特性和隔離級別,還介紹了多個事務可能會出現的并發問題,希望大家通過這篇文章能有所收獲。
事務是數據庫中的一個核心概念,指的是對數據庫的一組操作作為一個整體,要么都執行要么都不執行。
事務有四大特性:
1. 原子性:每個事務都是一個整體,不可再拆分,事務中的sql語句要么都執行成功,要么都執行失敗。
2. 一致性:事務執行前后數據庫的狀態保持一致。比如不管如何轉賬,轉賬前后的總錢數是不變的。
3. 隔離性:事務和事務之間不應該相互影響,保持隔離。
4. 持久性:事務一旦提交對數據庫的修改就是永久的,即使電腦發生故障也不會影響該修改,因為他的結果是記錄在存儲設備上的。
事務中有一個重要的特性“事務的隔離性”指的是事務和事務之間不應該相互影響,保持隔離,然而在現實中多個事務可能會操作同一個數據,造成并發問題:
臟讀:一個事務讀取到了另一個事務尚未提交的數據。
不可重復讀:事務一讀取到了age的值20,事務二將該值修改成了28,事務一再次讀取age的值28,事務一兩次讀取的age值不一致。
幻讀:事務一讀取到A表中有一條記錄,事務二往A表中插入一條記錄,事務一再次讀取的時候記錄變成了兩條,就像發生幻覺一樣。
不可重復讀和幻讀很相似,可以從兩個角度理解兩者的差別:
不可重復讀是另一個事務修改了數據,導致該事務多次讀取出來的值不一樣,而幻讀是另一個事務插入或刪除了記錄,導致該事務多次讀取出來的記錄數不一樣
不可重復讀的解決只需要鎖住會發生修改的記錄就可以,幻讀需要鎖住更大的范圍。
正是因為有這些問題存在,數據庫設置了隔離級別來處理:
1. 讀未提交(read uncommitted): 事務中的修改,即使沒有提交,其他事務也可以看得到
在這種隔離級別下有可能發生臟讀,不可重復讀和幻讀。
一家酒店對外預定房間,現在還剩四間房,一個顧客到小王這里來預定四間房,小王查詢系統發現還剩四間就將這四間房預定出去,該事務還沒提交的時候另一個顧客到小李這里來預定房間,小李查詢系統發現沒房了,就拒絕了這個訂單,此時小王的電腦發生故障,事務回滾,訂單失效,這就是臟讀造成的影響。
2. 讀已提交(read committed): 事務中的修改只有提交以后才能被其它事務看到。在這種隔離級別下有可能發生不可重復讀和幻讀。
還是定房間的例子,一個顧客到小王這里來預定四間房,小王將這四間房預定了出去,該事務還沒提交的時候另一個顧客到小李這里來預定房間,小李查詢系統發現還有四間房,剛想預定的時候小王的事務提交了,小李的系統立馬呈現0間房。這就是不可重復讀造成的影響。
3. 可重復讀 (repeatable read):該級別保證了在事務中看到的每行的記錄的結果是一致的,但是這種級別下有可能發生幻讀。
公司規定如果銷售額達不到就要扣工資,經理查詢小王的銷售業績,發現還差幾間房,經理喜上眉梢,把結果打印出來,結果打印出來的結果業績正好合格,原來小王在這當口又賣了幾張票正好填上了這個空缺。這就是幻讀造成的影響。
4. 串行化(serializable):該級別下所有的事務都是串行執行的,一個事務執行完了才能執行其它的事務,可以解決所有的并發問題,它是靠大量加鎖實現的,所以效率很低下。只有在需要絕對保證數據一致性,并且并發量不大的情況下,可以考慮。
看完上述內容,你們對事務的四大特性和隔離級別有進一步的了解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。