1.資料併發的問題
乙個資料庫可能擁有多個訪問客戶端,這些客戶端都可以併發方式訪問資料庫。資料庫中的相同資料可能同時被多個事務訪問,如果沒有採取必要的隔離措施,就會導致各種併發問題,破壞資料的完整性。這些問題可以歸結為5類,包括3類資料讀問題(髒讀、幻象讀和不可重複讀)以及2類資料更新問題(第一類丟失更新和第二類丟失更新)。下面,我們分別通過例項講解引發問題的場景。
髒讀(dirty read)
在講解髒讀前,我們先講乙個笑話:乙個有結巴的人在飲料店櫃檯前轉悠,老闆很熱情地迎上來:「喝一瓶?」,結巴連忙說:「我…喝…喝…」,老闆麻利地開啟易拉罐遞給結巴,結巴終於憋出了他的那句話:「我…喝…喝…喝不起啊!」。在這個笑話中,飲料店老闆就對結巴進行了髒讀。
a事務讀取b事務尚未提交的更改資料,並在這個資料的基礎上操作。如果恰巧b事務回滾,那麼a事務讀到的資料根本是不被承認的。來看取款事務和轉賬事務併發時引發的髒讀場景:
時間
轉賬事務a
取款事務b
t1
開始事務
t2
開始事務
t3
查詢賬戶餘額為1000元
t4
取出500元把餘額改為500元
t5
查詢賬戶餘額為500元(髒讀)t6
撤銷事務餘額恢復為1000元
t7
匯入100元把餘額改為600元
t8
提交事務
在這個場景中,b希望取款500元而後又撤銷了動作,而a往相同的賬戶中轉賬100元,就因為a事務讀取了b事務尚未提交的資料,因而造成賬戶白白丟失了500元。
不可重複讀(unrepeatable read)
不可重複讀是指a事務讀取了b事務已經提交的更改資料。假設a在取款事務的過程中,b往該賬戶轉賬100元,a兩次讀取賬戶的餘額發生不一致:
時間
取款事務a
轉賬事務b
t1
開始事務t2
開始事務t3
查詢賬戶餘額為1000元
t4
查詢賬戶餘額為1000元
t5
取出100元把餘額改為900元
t6
提交事務t7
查詢賬戶餘額為900元(和t4讀取的不一致)
在同一事務中,t4時間點和t7時間點讀取賬戶存款餘額不一樣。
幻象讀(phantom read)
a事務讀取b事務提交的新增資料,這時a事務將出現幻象讀的問題。幻象讀一般發生在計算統計資料的事務中,舉乙個例子,假設銀行系統在同乙個事務中,兩次統計存款賬戶的總金額,在兩次統計過程中,剛好新增了乙個存款賬戶,並存入100元,這時,兩次統計的總金額將不一致:
時間
統計金額事務a
轉賬事務b
t1
開始事務t2
開始事務t3
統計總存款數為10000元
t4
新增乙個存款賬戶,存款為100元
t5
提交事務t6
再次統計總存款數為10100元(幻象讀)
如果新增資料剛好滿足事務的查詢條件,這個新資料就進入了事務的視野,因而產生了兩個統計不一致的情況。
幻象讀和不可重複讀是兩個容易混淆的概念,前者是指讀到了其它已經提交事務的新增資料,而後者是指讀到了已經提交事務的更改資料(更改或刪除),為了避免這兩種情況,採取的對策是不同的,防止讀取到更改資料,只需要對操作的資料新增行級鎖,阻止操作中的資料發生變化,而防止讀取到新增資料,則往往需要新增表級鎖——將整個表鎖定,防止新增資料。
第一類丟失更新
a事務撤銷時,把已經提交的b事務的更新資料覆蓋了。這種錯誤可能造成很嚴重的問題,通過下面的賬戶取款轉賬就可以看出來:
時間
取款事務a
轉賬事務b
t1
開始事務
t2
開始事務t3
查詢賬戶餘額為1000元
t4
查詢賬戶餘額為1000元
t5
匯入100元把餘額改為1100元
t6
提交事務t7
取出100元把餘額改為900元
t8
撤銷事務t9
餘額恢復為1000元(丟失更新)
a事務在撤銷時,「不小心」將b事務已經轉入賬戶的金額給抹去了。
第二類丟失更新
a事務覆蓋b事務已經提交的資料,造成b事務所做操作丟失:
時間
轉賬事務a
取款事務b
t1
開始事務t2
開始事務t3
查詢賬戶餘額為1000元
t4
查詢賬戶餘額為1000元
t5
取出100元把餘額改為900元
t6
提交事務t7
匯入100元
t8
提交事務t9
把餘額改為1100元(丟失更新)
上面的例子裡由於支票轉賬事務覆蓋了取款事務對存款餘額所做的更新,導致銀行最後損失了100元,相反如果轉賬事務先提交,那麼使用者賬戶將損失100元
一.什麼是事務
事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做。
事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中乙個步驟失敗,將發生回滾操作,撤消撤消之前到事務開始時的所以操作。
二.事務的 acid
事務具有四個特徵:原子性( atomicity )、一致性( consistency )、隔離性( isolation )和持續性( durability )。這四個特性簡稱為 acid 特性。
1 、原子性
事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做
2 、一致性
事 務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。因此當資料庫只包含成功事務提交的結果時,就說資料庫處於一致性狀態。如果資料庫系統 執行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這時資料庫就處於一種不正確的狀態,或者說是 不一致的狀態。
3 、隔離性
乙個事務的執行不能其它事務干擾。即乙個事務內部的操作及使用的資料對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。
4 、持續性
也稱永久性,指乙個事務一旦提交,它對資料庫中的資料的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。
資料庫系統必須維護事務的以下特性 ( 簡稱 acid) :
原子性 (atomicity)
一致性 (consistency)
隔離性 (isolation)
永續性 (durability)
原子性 (atomicity)
事務中的所有操作要麼全部執行,要麼都不執行;
如果事務沒有原子性的保證,那麼在發生系統
故障的情況下,資料庫就有可能處於不一致狀
態。
資料庫事務四個特性
如果乙個資料庫聲稱支援事務的操作,那麼該資料庫必須要具備以下四個特性 原子性 atomicity 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能對資料庫有任何影響。一致性 consistency 一致性是指事務必須使資料...
及事務四個特性
一 什麼是事務 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做。事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中乙個步驟失敗,將發生回滾操作,撤消撤消之...
資料庫事務的四個特性及含義
資料庫 事務transanction正確執行的四個基本要素。原子性 針對整個事務中 所有執行的 操作,要麼全部完成,要麼全部不完成,不可能 停在中間某個環節。如果事務在執行過程中發生 了錯誤,會被回滾 rollback 到事務開始前的狀態,如同這個事務從來沒有執行過。一致性 在事務開始前和結束後,資...