資料庫事務以及JDBC事務隔離級別

2021-06-27 15:47:30 字數 2792 閱讀 5561

是併發控制的單元,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位.

原子性(atomic) 對資料的修改要麼全部執行,要麼全部不執行。 

一致性(consistent) 在事務執行前後,資料狀態保持一致性。 

隔離性(isolated) 乙個事務的處理不能影響另乙個事務的處理。 

持續性(durable) 事務處理結束,其效果不會再變。

不可重複讀是指a事務讀取了b事務已經提交的更改資料。假設a在取款事務的過程中,b往該賬戶轉賬100元,a兩次讀取賬戶的餘額發生不一致:

a事務讀取b事務提交的新增資料,這時a事務將出現幻象讀的問題;幻象讀一般發生在計算統計資料的事務中,舉乙個例子,假設銀行系統在同乙個事務中,兩次統計存款賬戶的總金額,在兩次統計過程中,剛好新增了乙個存款賬戶,並存入100元,這時,兩次統計的總金額將不一致:

幻讀和不可重複讀是兩個容易混淆的概念,前者是指讀到了其它已經提交事務的新增資料,而後者是指讀到了已經提交事務的更改資料(更改或刪除),為了避免這兩種情況,採取的對策是不同的,防止讀取到更改資料,只需要對操作的資料新增行級鎖,阻止操作中的資料發生變化,而防止讀取到新增資料,則往往需要新增表級鎖——將整個表鎖定,防止新增資料。

a事務讀取b事務尚未提交的更改資料,並在這個資料的基礎上操作。如果恰巧b事務回滾,那麼a事務讀到的資料根本是不被承認的。來看取款事務和轉賬事務併發時引發的髒讀場景:

a事務撤銷時,把已經提交的b事務的更新資料覆蓋了。這種錯誤可能造成很嚴重的問題,通過下面的賬戶取款轉賬就可以看出來:

a事務覆蓋b事務已經提交的資料,造成b事務所做操作丟失:

封鎖是實現併發控制的乙個非常重要的技術。所謂封鎖就是事務t在對某個資料物件例如表、記錄等操作之前,先向系統發出請求,對其加鎖。加鎖後事務t就對該資料物件有了一定的控制,在事務t釋放它的鎖之前,其它的事務不能更新此資料物件。 

基本的封鎖型別有兩種:

排它鎖(exclusive locks 簡記為x鎖) 

排它鎖又稱為寫鎖。若事務t對資料物件a加上x鎖,則只允許t讀取和修改a,其它任何事務都不能再對a加任何型別的鎖,直到t釋放a上的鎖。這就保證了其它事務在t釋放a上的鎖之前不能再讀取和修改a。 

共享鎖(share locks 簡記為s鎖)

共享鎖又稱為讀鎖。若事務t對資料物件a加上s鎖,則其它事務只能再對a加s鎖,而不能加x鎖,直到t釋放a上的s鎖。這就保證了其它事務可以讀a,但在t釋放a上的s鎖之前不能對a做任何修改。

在運用x鎖和s鎖這兩種基本封鎖,對資料物件加鎖時,還需要約定一些規則,例如應何時申請x鎖或s鎖、持鎖時間、何時釋放等。我們 稱這些規則為封鎖協議(locking protocol)。對封鎖方式規定不同的規則,就形成了各種不同的封鎖協議。

下面介紹**封鎖協議。

**封鎖協 議分別在不同程度上解決了丟失的修改、不可重複讀和讀"髒"資料等不一致性問題 ,為併發操作的正確排程提供一定的保證。

一級封鎖協議 

事務t在修改資料r之前必須先對其加x鎖,直到事務結束才釋放。事務結束包括正常結束(commit)和 非正常結束(rollback)。1級封鎖協議可防止丟失修改,並保證事務t是可恢復的。在1級封鎖協議中,如果僅僅是讀資料不對其進行修改,是不需要加 鎖的,所以它不能保證可重複讀和不讀"髒"資料。 

二級封鎖協議 

一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,讀完後即可釋放s鎖。二級封鎖協議除防止了丟失修改,還可進一步防止讀"髒"資料。 

**封鎖協議 

一級封鎖協議加上事務t在讀取資料r之前必須先對其加s鎖,直到事務結束才釋放。**封鎖協議除防止了丟失修改和不讀'髒'資料外,還進一步防止了不可重複讀。

儘管資料庫理論對併發一致性問題 提供了完善的解決機制,但讓程式設計師自己去控制如何加鎖以及加鎖、解鎖的時機顯然是很困難的事情。索性絕大多數資料庫以及開發工具都提供了事務隔離級別,讓使用者以一種更輕鬆的方式處理併發一致性問題 。 常見的事務隔離級別包括:readuncommitted、readcommitted、repeatableread和serializable四種。 不同的隔離級別下對資料庫的訪問方式以及資料庫的返回結果有可能是不同的

未提交讀(read uncommitted):最低隔離級別,乙個事務能讀取到別的事務未提交的更新資料,很不安全,可能出現丟失更新、髒讀、不可重複讀、幻讀; 

提交讀(read committed):乙個事務能讀取到別的事務提交的更新資料,不能看到未提交的更新資料,不可能可能出現丟失更新、髒讀,但可能出現不可重複讀、幻讀; 

可重複讀(repeatable read):保證同一事務中先後執行的多次查詢將返回同一結果,不受其他事務影響,可能可能出現丟失更新、髒讀、不可重複讀,但可能出現幻讀; 

序列化(serializable):最高隔離級別,不允許事務併發執行,而必須序列化執行,最安全,不可能出現更新、髒讀、不可重複讀、幻讀。

參考資料

資料庫事務以及隔離級別

例 張三給李四轉賬10元 李四賬戶增加10元,張三賬戶減少十元,要麼都執行成功,要麼都失敗 回滾 例 張三給李四轉20元,王五給孫六轉10元。兩個事務互不干擾,不能張三的錢轉給孫六。例 張三轉給李四40元 張三和李四的總賬戶餘額不變。原子性和隔離性保證一致性 這四種隔離級別是sql的標準定義。mys...

資料庫的事務 事務併發以及隔離級別

事務的定義 事務 transaction 是併發控制的單位,是使用者定義的乙個操作序列。這些操作要麼都做,要麼都不做,是乙個不可分割的工作單位。通過事務,sql server能將邏輯相關的一組操作繫結在一起,以便伺服器保持資料的完整性。事務通常是以begin transaction開始,以commi...

JDBC資料庫事務

事務 一組邏輯操作單元,使資料從一種狀態變換到另一種狀態。事務處理 事務操作 保證所有事務都作為乙個工作單元來執行,即使出現了故障,都不能改變這種執行方式。當在乙個事務中執行多個操作時,要麼所有的事務都被提交 commit 那麼這些修改就永久地儲存下來 要麼資料庫管理系統將放棄所作的所有修改,整個事...