資料庫事務 併發問題及隔離級別

2021-09-29 23:21:00 字數 2744 閱讀 1177

四、事務的隔離級別

我們學習資料庫,經常看到資料庫事務,acid事務等相關的概念,拋開資料庫,可以將事務更廣泛的定義為:乙個或多個原子操作組合而成的執行單元。更通俗的講,就是將幾件小事或是幾個步驟**起來作為乙個整體來處理對待。

而資料庫事務,即一條或多條不可再分的資料操作指令組合而成的執行單元。乙個標準的、合格的資料庫事務,應該需要滿足四個特性,即原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability),這也就是所稱的acid事務。

在四個事務特性中,資料的一致性是最關鍵的,保證資料的一致性是乙個資料庫最基本的要求,同時也是事務這乙個概念出現的乙個重要原因,更是衡量乙個事務是否合格的最重要的標準,也是事務最根本的追求。而影響事務一致性的因素主要有事務併發問題和資料庫系統故障。說到底,其他三個特性,都是服務於保證資料一致性而存在的。

事務的出現必然是為了解決某一問題。在使用dml(資料庫操作語言)或ddl(資料庫定義語言)使,多數情況下對資料的修改不是侷限於一條記錄或是一張資料表的。

試想這麼乙個簡單的圖書館借閱情景:a同學借了一本書a,在資料庫中我們要有必要的兩步操作,一是插入一條a借閱書a的記錄,二是把書a的庫存減一。

假若沒有事務,執行了第乙個操作後,系統忽然出現故障沒能成功執行第二個操作,這樣導致的結果是a借到了書a,但圖書館中書a的庫存卻沒有減少,是不符合邏輯,打破了資料的一致性原則。

簡單來講,事務的出現就是將這兩個步驟**在一起,實現的效果是:要麼兩個步驟都執行成功,要麼都不執行。從而保證了資料的一致性。對於事務的使用,這裡引出兩個概念,乙個叫事務的提交,即在事務成功執行後提交結束事務;乙個叫事務的回滾,即在事務執行過程中某個操作出現問題,恢復到事務執行之前的那個一致性狀態。

而事務的出現,也帶來了不少事務併發問題,解決這些問題和追求acid事務的目標是一致的。

事務帶來的併發問題常見的有以下四種情況

1、髒寫

髒寫是指兩個事務a、b,a更新資料還未提交,b也來更新資料。對於a來講,最終的資料不是自己想要更新的值。

髒寫問題使用行級排它鎖即可解決,在一條記錄被乙個事務更新時,另外的事務是無法更新這條事務的。所以不再詳述。

2、髒讀

髒讀是至兩個事務a、b,a讀取了b更新尚未提交的內容,b事務回滾,導致a讀取的內容錯誤。如圖:

3、不可重複讀

不可重複讀是指兩個事務a、b,a讀取乙個字段,b更新了這個字段,a再讀取一次這個字段,兩次讀取的結果不同。如圖

4、幻讀

幻讀是指兩個事務a、b,a讀取乙個欄位的行數,b插入或刪除了某些記錄,a再讀取這個欄位的行數,行數不同了。如圖

不可重複讀和幻讀問題十分相似,不可重複讀是併發事務b的update操作對事務a帶來的問題,幻讀是併發事務b的insert和delete操作對事務a帶來的問題。

為了解決事務的併發問題,相應出現了sql的隔離級別規範的概念。一般的,常見的隔離級別有以下四種,它們可以不同程度的解決事務的併發問題。

1、讀未提交(read uncommitted)

允許事務a讀取事務b未提交的更新。自然,事務的併發工作流程是與以上三幅所示的流程一樣的,髒讀、不可重複讀、幻讀問題均不可實現。

2、讀已提交(read committed)

只允許事務a讀取事務b已經提交的更新。若b事務更改某條記錄未結束(提交或回滾),a事務讀取相應記錄會阻塞至b事務結束。在個隔離級別下,髒讀問題圖示會變為:

3、可重複讀(repeatable read)

a事務讀取某個字段,在a事務操作期間,禁止b事務對該字段的更新。可重複讀解決事務的不可重複讀問題,這樣,流程圖變為:

4、序列化(serializable)

序列化即捨棄事務的併發處理能力,將所有事務序列執行,這樣雖然避免了所有的併發問題,但效能效率實在太低,一般不用。

四個隔離級別解決併發問題總結如下:

隔離級別

解決髒寫

解決髒讀

解決不可重複讀

解決幻讀

讀未提交

read uncommitted是否

否否讀已提交

read committed是是

否否可重複讀

repeatable read是是

是否序列化serializable是是

是是四個隔離級別解決問題程度的遞增,是用犧牲資料庫的併發效能來得到的,如序列化級別,解決了所有的併發問題,但卻沒有任何併發能力。所以需要根據實際業務情況選擇合適的隔離級別。

還需要清楚,四個隔離級別只是sql給出的規範,包括前面所講的acid事務的實現,每個資料庫儲存引擎對這些的實現技術都是不同的,所有引擎都在追求更高的隔離級別下的更高的併發能力。比如mysql預設使用的innodb引擎,使用mvcc技術在可重複讀級別下,不用阻塞事務b的寫操作就可以解決不可重複讀甚至是幻讀問題。

MySQL事務隔離級別及事務併發問題

1 原子性 atomicity 事務一旦開始,那麼我們只能有兩個結果,要麼全部執行完成,要麼全部都不做,不能停滯在事務中途。如果在執行 錯,必須把事務回滾到事務開始前。2 一致性 consistency 事務開始前和結束後,資料庫的完整性約束沒有被破壞 比如買東西,付款的時候,我扣錢成功了,對方也一...

資料庫併發問題和隔離級別

為什麼會出現 髒讀 因為沒有 select 操作沒有規矩。為什麼會出現 不可重複讀 因為 update 操作沒有規矩。為什麼會出現 幻讀 因為 insert 和 delete 操作沒有規矩。讀未提 read uncommitted 能預防啥?啥都預防不了。讀提交 read committed 能預防...

資料庫併發問題與隔離級別

資料庫的事務在併發執行的時候,如果不考慮隔離性,就會產生以下幾種問題 髒讀是指在乙個事務處理過程裡讀取了另乙個未提交的事務中的資料。假設事務1正在訪問資料並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,事務2也訪問這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料,那麼事務2讀...