本篇文章主要介紹資料庫事務的四大特性acid,以及資料庫的隔離級別。
事務指的是滿足 acid 特性的一系列操作。在資料庫中,可以通過 commit提交乙個事務,也可以使用 rollback 進行回滾。
原子性(atomicity):事務被視為不可分割的最小單元,要麼全部提交成功,要麼全部失敗回滾。
一致性(consistency):事務執行前後都保持一致性狀態。在一致性狀態下,所有事務對乙個資料的讀取結果都是相同的。
隔離性(isolation):乙個事務所做的修改在最終提交以前,對其它事務是不可見的。
永續性(durability):一旦事務提交,則其所做的修改將會永遠儲存到資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。可以通過資料庫備份和恢復來保證永續性。
在了解完資料庫的四大特性之後,我們來討論一下資料庫的隔離級別的問題。在此之前,我們考慮在沒有資料庫隔離性的情況下,多使用者併發操作可能會發生的問題。
在併發環境下,乙個事務如果受到另乙個事務的影響,那麼事務操作就無法滿足一致性條件。
丟失修改:多個事務同時讀取某一資料,乙個事務成功處理好了資料,被另乙個事務寫回原值,造成第乙個事務更新丟失。例如,t1 和 t2 兩個事務都對乙個資料進行修改,t1 先修改,t2 隨後修改,t2 的修改覆蓋了 t1 的修改。
髒讀:髒讀是指在乙個事務處理過程裡讀取了另乙個未提交的事務中的資料。例如,t1 修改乙個資料,t2 隨後讀取這個資料。如果 t1 撤銷了這次修改,那麼 t2 讀取的資料是髒資料。
不可重複讀:不可重複讀是指在對於資料庫的某個資料,乙個事務範圍內多次查詢卻返回了不同的資料值。這是由於在查詢間隔,被另乙個事務修改並提交了。例如,t2 讀取乙個資料,t1 對該資料做了修改。如果 t2 再次讀取這個資料,此時讀取的結果和和第一次讀取的結果不同。
幻讀(虛讀):幻讀是事務非獨立執行時發生的一種現象。例如,t1 讀取某個範圍的資料,t2在這個範圍內插入新的資料,t1再次讀取這個範圍的資料,此時讀取的結果和和第一次讀取的結果不同。
產生併發不一致性問題主要原因是破壞了事務的隔離性,解決方法是通過併發控制來保證隔離性。併發控制可以通過封鎖來實現,但是封鎖操作都要使用者自己控制,相當複雜。資料庫管理系統提供了事務的隔離級別,讓使用者以一種更輕鬆的方式處理併發一致性問題。
現在我們來看下事務的四種隔離級別。
未提交讀(read uncommitted):事務中的修改,即使沒有提交,對其它事務也是可見的。最低級別,任何情況都無法保證。
提交讀(read committed):乙個事務只能讀取已經提交的事務所做的修改。換句話說,乙個事務所做的修改在提交之前對其它事務是不可見的。可避免髒讀的發生。
可重複讀(repeatable read):保證在同乙個事務中多次讀取同樣資料的結果是一樣的。可避免髒讀、不可重複讀的發生。
可序列化(serialixable):強制事務序列執行。可避免髒讀、不可重複讀、幻讀的發生。
四種隔離級別的對比
隔離級別
髒讀不可重複讀
幻影讀未提交讀
yesyes
yes提交讀
noyes
yes可重複讀
nono
yes可序列化
nono
no以上四種隔離級別最高的是serialixable(可序列化)級別,最低的是readuncommitted(未提交讀)級別,當然級別越高,執行效率就越低。像serialixable(可序列化)這樣的級別, 就是以鎖表的方式使得其他的執行緒只能在鎖外等待,所以平時選用何種隔離級別應該根據實際情況。
在mysql資料庫中,支援上面四種隔離級別,預設的為repeatable read(可重複讀);而在oracle資料庫中,只支援serialixable(序列化)級別和readcommitted(讀已提交)這兩種級別 ,其中預設的為read committed級別。
資料庫事務的四大特性以及事務的隔離級別
如果乙個資料庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性 acid atomic 原子性 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾 consistency 一致性 一致性是指事務必須使資料庫從乙個一致性狀態變換到另乙個一致性狀態,也就是說乙個事務執行之前和執行之後都必須...
資料庫事務的四大特性以及事務的隔離級別
本篇講訴資料庫中事務的四大特性 acid 並且將會詳細地說明事務的隔離級別。如果乙個資料庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,...
資料庫事務 四大特性 隔離級別
以下引用自 原子性 atomicity 乙個事務要麼全部執行,要麼不執行 一致性 consistency 事務的執行並不改變資料庫中資料的一致性。例如,完整性約束了a b 10,乙個事務改變了a,那麼b也隨之改變 拿轉賬來說,假設使用者a和使用者b兩者的錢加起來一共是5000,那麼不管a和b之間如何...