1. 程式人生 > >資料庫之事務

資料庫之事務

定義:

事務是併發控制的單位,是使用者定義的一個操作序列。這些操作要麼都做,要麼都不做,是個不可分割的工作單位。如果某一事務成功,則在該事務中進行的所有資料更改均會提交,成為資料庫中永久的組成部分。如果事務遇到錯誤,則必須取消或回滾,所有資料均被更改清除。

特性(ACID):

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序列化

序列化是最高的事務隔離級別,同時代價也最高,效能最低,一般很少用,在該級別下事務順序執行,不僅可以避免髒讀,不可重複讀,還避免了幻讀。

總結:

關於事務的簡單總結就這麼多,想要有更深的體會還得多多實踐,希望“小張和她女朋友”的故事可以對大家有所幫助。