【數據庫】事務

定義

所謂的事務,它是一個操作序列,這些 操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。所以,事務是數據庫維護數據一致性的單位,在每個事務結束時,都能保持數據一致性。

數據庫事務的存在包含有以下兩個目的:
(1)爲數據庫操作序列提供了一個從失敗中恢復到正常狀態的方法,同時提供了數據庫即使在異常狀態下仍能保持一致性的方法。
(2)當多個應用程序在併發訪問數據庫時,可以在這些應用程序之間提供一個隔離方法,以防止彼此的操作互相干擾。

基本特性(ACID)

並非任意的對數據庫的操作序列都是數據庫事務。數據庫事務擁有以下四個特性,習慣上被稱之爲ACID特性:

  • 原子性(Atomicity):事務作爲一個整體被執行,包含在其中的對數據庫的操作要麼全部被執行,要麼都不執行。

  • 一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變爲另一個一致狀態。一致狀態的含義是數據庫中的數據應滿足完整性約束。

  • 隔離性(Isolation):多個事務併發執行時,一個事務的執行不應影響其他事務的執行。

  • 持久性(Durability):已被提交的事務對數據庫的修改應該永久保存在數據庫中。

基本語句

  • 開始事務:begin TRANSACTION;

  • 提交事務:commit TRANSACTION;

  • 回滾事務:rollback TRANSACTION;

併發問題

一個數據庫可能擁有多個訪問客戶端,這些客戶端都可以併發方式訪問數據庫。數據庫中的相同數據可能同時被多個事務訪問,如果沒有采取必要的隔離措施,就會導致各種併發問題,破壞數據的完整性。這些問題可以歸結爲5類,包括3類數據讀問題(髒讀、幻象讀和不可重複讀)以及2類數據更新問題(第一類丟失更新和第二類丟失更新):

  • 髒讀:一個事務讀取了另一個未提交的並行事務寫的數據。當第二個事務選擇其它事務正在更新的行時,會發生未確認的相關性問題。第二個事務正在讀取的數據還沒有確認並且可能由更新此行的事務所更改。換句話說,當事務1修改某一數據,並將其寫回磁盤,事務2讀取同一數據後,事務1由於某種原因被撤銷,這時事務1已修改過的數據恢復原值,事務2讀到的數據就與數據庫中的數據不一致,是不正確的數據,稱爲髒讀。

  • 不可重複讀:一個事務重新讀取前面讀取過的數據,發現該數據已經被另一個已提交的事務修改過。即事務1讀取某一數據後,事務2對其做了修改,當事務1再次讀數據時,得到的與第一次不同的值。

  • 幻像讀:又稱幻讀。如果一個事務在提交查詢結果之前,另一個事務可以更改該結果,就會發生這種情況。這句話也可以這樣解釋,事務1按一定條件從數據庫中讀取某些數據記錄後未提交查詢結果,事務2刪除了其中部分記錄,事務1再次按相同條件讀取數據時,發現某些記錄神祕地消失了;或者事務1按一定條件從數據庫中讀取某些數據記錄後未提交查詢結果,事務2插入了一些記錄,當事務1再次按相同條件讀取數據時,發現多了一些記錄。

  • 第一類丟失更新:A事務撤銷時,把已經提交的B事務的更新數據覆蓋了

  • 第二類丟失更新:A事務提交時覆蓋了B事務提交的數據。

併發操作的調度

爲了保證並行操作的正確性,DBMS的並行控制機制必須提供一定的手段來保證調度是可串行化的。
從理論上講,在某一事務執行時禁止其他事務執行的調度策略一定是可串行化的調度,這也是最簡單的調度策略,但這種方法實際上是不可行的,因爲它使用戶不能充分共享數據庫資源。
目前DBMS普遍採用封鎖方法(悲觀方法)來保證調度的正確性;即保證並行操作調度的可串行性。除此之外還有其他一些方法,如樂觀方法、時標方法等。

  • 悲觀併發控制:鎖定系統阻止用戶以影響其它用戶的方式修改數據。如果用戶執行的操作導致應用了某個鎖,則直到這個鎖的所有者釋放該鎖,其它用戶才能執行與該鎖衝突的操作。該方法主要用在數據爭奪激烈的環境中,以及出現併發衝突時用鎖保護數據的成本比回滾事務的成本低的環境中,因此稱該方法爲悲觀併發控制。

  • 樂觀併發控制:在樂觀併發控制中,用戶讀數據時不鎖定數據。在執行更新時,系統進行檢查,查看另一個用戶讀過數據後是否更改了數據。如果另一個用戶更新了數據,將產生一個錯誤。一般情況下,接收錯誤信息的用戶將回滾事務並重新開始。該方法主要用在數據爭奪少的環境內,以及偶爾回滾事務的成本超過讀數據時鎖定數據的成本的環境內,因此稱該方法爲樂觀併發控制。

  • 時標併發控制:時標和封鎖技術之間的基本區別是封鎖是使一組事務的併發執行(即交叉執行)同步,使用它等價於這些事務的某一串行操作;時標法也是使用一組事務的交叉執行同步,但是使它等價於這些事務的一個特定的串行執行,即由時標的時序所確定的一個執行。如果發生衝突,是通過撤銷並重新啓動一個事務解決的。事務重新啓動,則賦予新的時標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章