1. 程式人生 > >資料庫管理(事務、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 可序列化

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