事務是一系列的資料庫操作,是資料庫應用程式的基本邏輯單元,也是恢復和併發控制的基本單位。
事務處理技術主要包括資料庫恢復技術和併發控制技術。本篇博文主要總結下併發控制技術。
事務:是使用者定義的乙個資料庫操作序列,這些操作要麼全做,要麼全不做,是乙個不可分割的工作單位。例如,在關聯式資料庫中,乙個事務可以是一條sql語句、一組sql語句或整個程式。一般來說,乙個程式中包含多個事務。
acid,是指在可靠資料庫管理系統(dbms)中,事務(transaction)所應該具有的四個特性:
a:原子性(atomicity): 事務是乙個或多個行為**在一起組成乙個單獨的工作單元,事務中的動作要不都發生,要不都不發生。
c:一致性(consistent): 即在事務開始之前和結束之後,資料庫的完整性約束沒有被破壞。
資料庫層面:在乙個事務執行前和執行後,資料會符合你設定的約束(例如unique約束,foreign key約束,check約束等)和觸發器設定.由資料庫進行保證.
業務層面:保持業務的一致性.需要由開發人員進行保證.
i:隔離性(isolation):指的是在併發環境中,事務之間互相影響的程度(即併發事務間資料的可見程度).當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間.由併發事務所做的修改必須與任何其他併發事務所做的修改隔離.事務檢視資料更新時,資料所處的狀態要麼是另一事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視到中間狀態的資料.。
d:持續性(durability): 也叫永久性,指一旦事務完成,事務的結果應該持久化,用來保證即使系統崩潰也不會破壞事務的結果。
保證事務acid特性是事務管理的重要任務。事務acid特性可能遭到破壞的因素有:
(1)多個事務並行執行時,不同事務的操作交叉執行。
(2)事務在執行過程中被強行停止。
併發操作帶來的資料不一致性包括丟失修改、不可重複讀和讀「髒」資料。
no.1 丟失修改(或叫丟失更新)
如果兩個事務都要更新資料庫乙個欄位x,x=100;
事務a事務b
讀取x=100
讀取x=100
寫入x=x+100
寫入x=x+200
事務結束x=200
事務結束x=300
最後x=300
兩個不同的事務同時獲得了相同的資料,又都對這個資料進行了修改,那麼先提交的事務的更新就會被後提交事務的更新覆蓋掉,叫做丟失更新。
no.2 不可重複讀
乙個事務執行期間,在自己沒有更新資料庫的情況下,同乙個查詢操作在執行一次或多次的情況下,結果應該是一致的。
事務a事務b
讀取x=100
讀取x=100
讀取x=100
寫入x=x+100
事務結束, x=200
讀取x=200
(此時,在同乙個事務a中,讀取的x值發生了變化!)
事務結束
這種情況事務a多次讀取資料出現不一致的結果。
摘自王珊老師的《資料庫系統概論》(第5版)的解釋:不可重複讀包括三種情況(後兩種情況也稱為幻影現象或幻讀):
(1):事務t1讀取某一資料之後,事務t2對其進行了修改,當事務t1再次讀該資料時,得到與前一次不同的值.如上所示。
(2):事務t1按一定條件從資料庫中讀取了某些資料記錄後,事務t2刪除了其中部分記錄,當t1再次按照相同條件讀取資料時,發現某些記錄神秘的消失了。
(3):事務t1按一定條件從資料庫中讀取了某些資料記錄後,事務t2插入了一些記錄,當t1再次按照相同條件讀取資料時,發現多了一些記錄。
no.3 髒讀(讀髒資料,未提交讀)
事務a事務b
寫入x=x+100 (x=200)
讀取x=200 (讀取了事務b未提交的資料)
事務回滾x=100
事務結束x=100
事務結束
事務讀取了未提交的資料,如圖 事務b可能出現未提交或者提交不成功的情況而進行回滾,這就導致事務a讀取了錯誤的資料,也叫髒資料。
併發控制的主要技術有封鎖(locking)、時間戳(timestamp)、樂觀控制法(optimistic sheduler)和多版本併發控制(multi-version concurrency control,mvcc)等。
下面主要講封鎖方法。
封鎖是實現併發控制的乙個非常重要的技術。基本的封鎖型別有兩種:排他鎖(x鎖)和共享鎖(s鎖)。
排它鎖又稱寫鎖,若事務t對資料物件a加上x鎖,則只允許t讀取和修改a,其他任何事務都不能再對a加任何型別的鎖直到t釋放a上的鎖為止。
共享鎖又稱讀鎖,若事務t對資料物件a加上s鎖,則事務t可以讀a但不能修改a,其他事物只能再對a加s鎖,而不能加x鎖。
在運用 排他鎖 和 共享鎖 對資料物件加鎖時,還需要約定一些規則,例如何時申請 排他鎖 或 共享鎖、持鎖時間、何時釋放等。稱這些規則為封鎖協議(locking protocol)。對封鎖方式規定不同的規則,就形成了各種不同的封鎖協議。不同的封鎖協議對應不同的隔離級別。
在標準sql規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同:
a.未授權讀取(read uncommited):允許髒讀取,但不允許丟失修改。
對應一級封鎖協議:一級封鎖協議是:事務t在修改資料r之前必須先對其加x鎖,直到事務結束才釋放。事務結束包括正常結束(commit)和非正常結束(rollback)。
b.授權讀取(read committed):允許不可重複讀取,但不允許髒讀取和丟失修改。這可以通過「瞬間共享讀鎖」和「排他寫鎖」實現。
對應二級封鎖協議:二級封鎖協議是:一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,讀完後即可釋放s鎖(瞬間s鎖)。
c.可重複讀取(repeatable read):禁止不可重複讀取和髒讀取和丟失修改,但是有時可能出現幻影資料。這可以通過「共享讀鎖」和「排他寫鎖」實現。
對應**封鎖協議:**封鎖協議是:一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,直到事務結束才釋放。
d.序列化(serializable):提供嚴格的事務隔離。它要求事務序列化執行,事務只能乙個接著乙個地執行,但不能併發執行。
四級封鎖協議是對**封鎖協議的增強,其實現機制也最為簡單,直接對事務中所讀取或者更改的資料所在的表加表鎖,也就是說,其他事務不能讀寫該表中的任何資料。這樣所有的髒讀,不可重複讀,幻讀,都得以避免!
資料庫 事務 併發控制技術
事務指的是連續的對資料庫操作的集合,對於乙個事務中的所有的資料庫操作,要麼全部成功,要麼全部失敗。允許多個使用者同時使用的資料可系統為多使用者資料庫系統。多使用者資料庫系統的特點是 在同一時刻,併發執行的事務數量可以達到成千上萬個。多事務執行方式有三種 1 事務的序列執行 每個時刻只有乙個事務執行,...
資料庫併發控制
資料庫併發控制 1 在資料庫中為什麼要併發控制?答 資料庫是共享資源,通常有許多個事務同時在執行。當多個事務併發地訪問資料庫時就會產生同時讀取和 或修改同一資料的情況。若對併發操作不加控制就可能會訪問和儲存不正確的資料,破壞資料庫的一致性。所以資料庫管理系統必須提供併發控制機制。2 併發操作可能會產...
資料庫併發控制
acid,是指在可靠資料庫管理系統 dbms 中,事務 transaction 所應該具有的四個特性 a 原子性 atomicity 事務是乙個或多個行為 在一起組成乙個單獨的工作單元,事務中的動作要不都發生,要不都不發生.c 一致性 consistent 即在事務開始之前和結束之後,資料庫的完整性...