事務是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是個不可分割的工作單位。如果某一事務成功,則在該事務中進行的所有資料更改均會提交,成為資料庫中永久的組成部分。如果事務遇到錯誤,則必須取消或回滾,所有資料均被更改清除。
1)原子性(atomicity):
事務是資料庫的邏輯工作單元,事務中包括的諸多操縱要麼全做,要麼全不做。
2)一致性(consistency):
事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。
3)隔離性(isolation):
乙個事務的執行不能被其他事務干擾。
4)持續性/永久性(durability):
乙個事務一但提交,它對資料庫中資料的改變就應該是永久性的。
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted、read committed、repeatable read、serializable,這呲個級別可以逐個解決髒讀、不可重複讀和幻讀等問題。
在理解事務的隔離級別之前,先看看什麼是髒讀、不可重複讀、幻讀。
髒讀:
允許事務b可以讀到事務a修改而未提交的資料,可能會造成了髒讀。髒讀本質就是無效的資料,只有當事務a回滾,那麼事務b讀到的資料才為無效的,所以這裡只是可能造成髒讀,當事務a不回滾的時候,事務b讀到的資料就不為髒資料,也就是有效的資料,髒資料會導致以後的操作都會發生錯誤,一定要去避免,不能憑藉僥倖,事務a不能百分之百保證不回滾,所以這種隔離級別很少用於實際應用,並且它的效能也不比其他級別好多少。
不可重複讀:
不可重複讀是指在乙個事務範圍中2次或者對次查詢同一資料m返回了不同的資料。例如:事務b讀取某一資料,事務a修改了該資料m並且提交,事務b又讀取該資料m(可能是再次校驗),在同乙個事務b中,讀取同乙個資料m的結果集不同。
幻讀:
當使用者讀取某乙個範圍的資料行時,另乙個事務又在該資料範圍內查詢了新行,當使用者再讀取該範圍的資料行時,會發現會有新的「幻影行」,例如:事務b讀某乙個資料m,事務a對資料m增加了一行並提交,事務b又讀資料m,發生多出了一行造成結果不一致(如果行數相同,則是不可重複讀)。
做了乙份兼職,老闆給小張把3000元打到小張的賬號上,但是該事務並未提交,而小張正好去檢視賬戶,發現工資已經到賬,是3000元,甚是高興。但非常不幸的是,領導發現給小張的工資金額不對,是300元,於是迅速回滾了事務,修改金額後,將事務提交,最後小張的實際工資只有300元,小張很是傷心。
這就是我們所說的髒讀,事務a:領導給小張發工資,事務b:小張查詢工資賬戶,事務b讀取了事務a尚未提交的資料。當隔離級別設定為未提交讀是,就可能出現髒讀。
read committed 提交讀
小張拿著工資卡去消費,系統讀取到卡里確實有300元,而此時她的女朋友也正好在網上轉賬,把小張工資卡的300元轉到另一賬戶,並在小張之前提交了事務,當小張扣款是時,系統檢查到小張的工資卡已經沒有錢,扣款失敗,小張十分納悶,這是什麼鬼。。。
這就是我們所說的可重複讀,兩個併發的事務,事務a:小張消費,事務b:小張的女朋友網上轉賬,事務a實現讀取了資料,事務b緊接著更新了資料,並提交了事務,而事務a再次讀取該資料時,資料已經發生了改變。
當隔離級別設定為提交讀時,避免了髒讀,但是可能會造成不可重複讀。大多數的資料庫的預設級別就提交讀,如:sqlserver,oracle。
repeatable read 重複讀
當隔離級別設定為重複讀時,可以避免不可重複讀。當小張拿著工資卡去消費時,一旦系統開始讀取工資卡的資訊,小張的女朋友就不可能對該記錄進行修改,也就是小張的女朋友不能在此時轉賬。
雖然重複讀避免了不可重複讀,但還有可能出現幻讀。
小張的女朋友在銀行部門工作,她時常通過銀行內部系統檢視小張的信用卡消費記錄。有一天,她在查詢到小張的當月信用卡的總消費金額(select sum(amount)from transaction where month=本月)為25元,而小張此時正好在外面胡吃海塞後再收銀台買單,消費200元,即新增了一條100元的消費記錄(insert transaction。。。),並提交了事務,隨後小張的女朋友將小張當月信用卡消費的明細列印到a4紙上,卻發現消費總額為250元,小張的女朋友很詫異,以為出現了幻覺,幻讀就是這種情況。
mysql的預設隔離級別是重複讀。
serializable序列化
序列化是最高的事務隔離級別,同時代價也最高,效能最低,一般很少用,在該級別下事務順序執行,不僅可以避免髒讀,不可重複讀,還避免了幻讀。
關於事務的簡單總結就這麼多,想要有更深的體會還得多多實踐,希望「小張和她女朋友」的故事可以對大家有所幫助。
資料庫之事務
概述 事務一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 特徵 事務具有4個基本特徵,分別是 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 duration 簡稱acid。原子性事務的原子性...
資料庫 之 事務
本文將以mysql為主分析 在mysql中只有使用了innodb資料庫引擎的資料庫或表才支援事務 事務處理可以用來維護資料庫的完整性,保證成批的sql語句要麼全部執行,要麼全部不執行 事務用來管理insert update delete語句。事務必須滿足4個條件acid a atomicity 原子...
資料庫之事務
在關聯式資料庫中,乙個事務可以是一條sql語句,一組sql語句或整個程式。原子性 atomicity 乙個事務是乙個不可分割的工作單位,事務中包括的操作要麼都做,要麼都不做。一致性 consistency 事務必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。一致性與原子性是密切相關的。隔離性 i...