資料庫事務
深入認識事務
事務定義
(宏觀角度:應用程式設計師)一個存取或改變資料庫內容的程式的一次執行,或者說一條或多條SQL語句一次執行被看作一個事務。事務是資料庫管理系統提供的控制數據操作的一種手段,通過這一手段,應用程式設計師將一系列的資料庫操作組合在一起作為一個整體進行操作和控制,以便資料庫管理系統能夠提供一致性狀態轉換的保證。
(微觀角度:DBMS)對資料庫的一系列基本操作(讀,寫)的一個整體性執行。
事務的並發執行
多個事務從宏觀上看是並行執行的,但其微觀上的基本操作(讀,寫)則可以是交叉執行的。
事務特性ACID
原子性Atomicity: DBMS能夠保證事務的一組更新操作是原子不可分的,即對資料庫而言,要麼全做,要麼不做。
一致性Consistency: DBMS保證事務的操作狀態是正確的,符合一致性的操作規則,不能出現三種典型的不一致性,它是進一步由隔離性來保證的。
隔離性Isolation: DBMS保證並發執行的多個事務之間互相不受影響。例如,兩個事務T1和T2,即使是並發執行,也相當於先執行T1再執行T2 或者反之。
持久性Durability: DBMS保證已提交事務的影響是持久的,被撤銷事務的影響是可恢復的。
事務結合其特性的理解
具有ACID特性的若干資料庫基本操作的組合體被稱為事務。
事務調度與可串列性
事務調度
一組事務的基本步(讀 ,寫,其他控制操作如加鎖,解鎖等)的一種執行順序稱為對這組事務的一個調度。
並發(並行)調度
多個事務從宏觀上看是並行執行的,但其微觀上的基本操作(讀,寫)則是交叉執行的。
並發調度的正確性
當且僅當在這個並發調度下所得到的新資料庫結果與分別串列地運行這些事務所得到的新資料庫完全一致,則說明調度是正確的。
可串列性
如果不管資料庫初始狀態如何,一個調度對資料庫狀態的影響都和某個串列調度相同,則我們說這個調度是可串列化的或是具有可串列性的。
注意:
- 可串列化調度一定是正確的並行調度,但正確的並行調度,卻未必是可串列化的調度。
- 並行調度的正確性是指內容上結果正確性,而可串列性是指形式上結果正確性,便於操作。
- 可串列化的等效串列序列不一定唯一。
衝突
調度中一對連續的動作,如果它們的順序交換,那麼涉及的事務中至少有一個事務的行為會改變。
有衝突的兩個操作是不能交換次序的,沒有衝突的兩個事務是可交換的。
幾種衝突的情況
- 同一個事務的任何兩個操作都是衝突的
- 『不同事務對同一元素的兩個寫操作是衝突的
- 不同事務對同一元素的一讀一寫操作是衝突的
衝突可串列性
一個調度,如果通過交換相鄰兩個無衝突的操作能夠轉換到某一個串列的調度,則稱此調度為衝突可串列化的調度。
注意:
- 衝突可串列性是比可串列性要嚴格的概念
- 滿足衝突可串列性,一定滿足可串列性;反之不然
基於封鎖的並發控制
鎖的概念
鎖是控制並發的一種手段,是資料庫元素上的並發控制標誌
關於鎖的基本知識點
- 每一數據元素都有唯一的鎖
- 每一事務讀寫數據元素前,要獲得鎖
- 如果被其他事務持有該元素的鎖,則要等待
- 事務處理完成後要釋放鎖
- 鎖本身並不能保證衝突可串列性,只是為調度提供了控制的手段,具體如何使用鎖需要說明——不同協議
封鎖協議之鎖的類型
排他鎖X
只有一個事務能讀和寫,其他任何事務都不能讀、寫
共享鎖S
所有事務都可以讀,但任何事務都不能寫
更新鎖U
初始讀,以後可以升級為寫
增量鎖I
區分增量更新和其他類型的更新
封鎖協議0級到3級協議(加鎖的時機)
SQL之隔離性級別
對應封鎖協議0級到3級協議
注意: 所有的並發控制都不允許有丟失修改。
封鎖協議之封鎖粒度
- 封鎖粒度是指封鎖數據對象的大小。
- 粒度單位:屬性值——>元祖——>元祖集合——>整個關係——>整個DB索引項——>整個索引
- 由前往後:並發度小,封鎖開銷小
- 由後往前:並發讀大,封鎖開銷也大
兩段封鎖協議
定義
是一種基於鎖的並發控制方法。讀寫數據之前,每個事務中所有封鎖請求先於任何一個解鎖請求。兩階段:加鎖段和解鎖段。加鎖段不能有解鎖操作,解鎖段不能有加鎖操作。
作用
兩段封鎖協議是可以保證衝突可串列性的。
注意:兩段封鎖協議是可能產生死鎖的協議