數據庫管理(事務、ACID、併發、封鎖、可串行化、隔離)

數據庫管理(事務、ACID、併發、封鎖、可串行化、隔離)(轉)

 

1、數據庫事務

1.1 數據庫事務(Database Transaction) ,是指作爲單個邏輯工作單元執行的一系列操作。

1.2 事務的4個特性(ACID):
(1)原子性(atomic)(atomicity)事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。原子性消除了系統處理操作子集的可能性。
(2)一致性(consistent)(consistency)事務在完成時,必須使所有的數據都保持一致狀態。事務結束時,所有的內部數據結構(如B樹索引或雙向鏈表)都必須是正確的。
(3)隔離性(insulation)(isolation)由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務查看數據時數據所處的狀 態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱爲可串行性,因爲它能夠重新裝載起始數據, 並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。當事務可序列化時將獲得最高的隔離級別。在此級別上,從一組可並行執行的事務獲得的 結果與通過連續運行每個事務所獲得的結果相同。由於高度隔離會限制可並行執行的事務數,所以一些應用程序降低隔離級別以換取更大的吞吐量。防止數據丟失。
(4)持久性(Duration)(durability)事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。

1.3 事務有3種模型: 
(1)隱式事務是指每一條數據操作語句都自動地成爲一個事務;每個事務都沒有顯式的開始和結束標記。
(2)顯式事務是指有顯式的開始結束標記的事務;或者開始是隱式的,事務的結束有明確的標記。(begin transaction 事務開始--commit 事務正常結束--rollback事務出錯回滾)
(3)自動事務是系統自動默認的,開始和結束不用標記。 

2、併發控制

2.1 常見併發併發一致性問題包括:丟失的修改(lost update)、讀髒數據(dirty read)、不可重複讀(unrepeatable read)、幻影讀(phantom read,又叫幻讀,幻象讀,非一致性讀,或者幽靈數據,往往與不可重複讀歸爲一類)。

2.2 爲了解決併發不一致問題,SQL標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的併發處理,並擁有更低的系統開銷。
(1)ReadUncommitted(讀取未提交內容)在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因爲它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之爲髒讀。
(2)ReadCommitted(讀取提交內容)這是大多數數據庫系統的默認隔離級別(比如SQLSever,Oracle,但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別也支持所謂的不可重複讀,因爲同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果。
(3)RepeatableRead(可重讀)這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在併發讀取數據時,會看到同樣的數據行。不過理論上,這會導致幻讀。
(4)Serializable(可串行化)這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

 

  髒讀 Dirty Read 不可重複讀 Non-Repeatable Read 錯誤讀取/幻讀/虛讀 Phantom Read
讀未提交 Read Uncommitted
讀已提交 Read Committed ×
可重複讀 Repeatable Read × ×
可串行化 Serializable × × ×

2.3 爲了體現隔離級別,數據庫使用了封鎖技術(locking)

(1)S鎖,Share Locks,共享鎖,讀鎖,被加鎖的對象可以被持鎖事務讀取,但是不能被修改,其他事務也可以在上面再加s鎖。
(2)X鎖,Exclusive Locks,排他鎖,寫鎖,被加鎖的對象只能被持有鎖的事務讀取和修改,其他事務無法在該對象上加其他鎖,也不能讀取和修改該對象。

 2.4 引入封鎖技術又帶來了“死鎖”問題

解決死鎖的兩類方法:
(1)預防法:一次封鎖法(每個事務必須將所用到的數據全部加鎖,否則不能執行)和順序封鎖法(對用到的數據按照預先設定的順序加鎖)。
(2)診斷解除法:超時法(一事務超過規定時間則判定發生死鎖)和等待圖法事務等待圖是一個有向圖G=(T,U),T爲結點的集合,每個結點表示正在運行的事務;U爲邊的集合,每條邊表示事務等待的情況。若事務T1等待事務T2,則T1,T2之間有一條有向邊,從 T1 指向 T2。如果發現圖中存在迴路,則表示系統中出現了死鎖)。

2.5 封鎖協議(Locking Protocol)

2.5.1 保證數據一致性的封鎖協議的三級封鎖協議

對併發操作的不正確調度可能會帶來的三種數據不一致性:丟失修改、不可重複讀和讀“髒”數據。三級封鎖協議分別在不同程度上解決了這一問題。
(1)1級封鎖協議:事務T修改數據R之前必須先對其X加鎖,直到事務結束才釋放。事務結束包括正常結束和非正常結束。1級封鎖協議可防止丟失修改,並保證事務T是可恢復的。在1級封鎖協議中,如果僅僅是讀數據不對其進行修改,是不需要加鎖的,所以它不能保證可重複讀和不讀“髒”數據。
(2)2級封鎖協議:1級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,讀完後即可釋放S鎖。2級封鎖協議除防止丟失修改,還可進一步防止讀“髒”數據。在2級封鎖協議中,由於讀完數據後即可釋放S鎖,所以它不能保證保重複讀。
(3)3級封鎖協議:1級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,直到事務結果才釋放。3級封鎖協議除防止丟失修改不讀“髒”數據外,還進一步防止了不可重複讀。 

 2.5.2 保證並行調度可串行性的封鎖協議的兩段鎖協議

可串行性是並行調度正確性的唯一準則,兩段鎖(簡稱2PL)協議是爲保證並行調度可串行性而提供的封鎖協議。
兩段鎖協議規定:
在對任何數據進行讀、寫操作之前,事務道首先要獲得對該數據的封鎖,而且在釋放一個封鎖之生,事務不再獲得任何其他封鎖。
所謂“兩段”鎖的含義是,事務分爲兩個階段,第一階段是獲得封鎖,也稱爲擴展階段,第二階段是釋放封鎖,也稱爲收縮階段。

 2.6 可串行化

調度是一個或多個事務的重要操作按時間排序的一個序列。
如果一個調度的動作首先是一個事務的所有動作,然後是另一個事務的所有動作,以此類推,而沒有動作的混合,那麼我們說這一調度是串行的。
事務的正確性原則告訴我們,每個串行調度都將保持數據庫狀態的一致性。 通常,不管數據庫初態怎樣,一個調度對數據庫狀態的影響都和某個串行調度相同,我們就說這個調度是可串行化的。[如果一併行調度的結果等價於某一串行調度的結果,那麼這個並行調度成爲可串行化的]

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