数据库三级封锁协议
數據庫三級封鎖協議
數據庫三級封鎖協議是為了對數據庫并發操作進行控制,防止更改丟失,讀臟數據,不可重復讀等問題.為了解決這類問題引入的解決方案就是加鎖,又根據添加鎖的種類,設置時間,釋放時間的不同分為三種封鎖協議.
鎖的種類
在數據庫的三級封鎖協議中分為兩種鎖
- 排他鎖(exclusive lock,X鎖),又稱為寫鎖
- 共享鎖(shared lock,S鎖),又稱為讀鎖
排他鎖(X鎖)
排他鎖,又稱為寫鎖,可以對數據進行讀取和修改操作.當一個事務對數據添加X鎖時,其他事務都不能對該數據添加鎖,即同一時間只有一條事務可以對數據進行修改操作.其他事務只能等待該事務完成后才能對數據進行修改操作.所以我們通常把這類對數據進行修改操作的鎖稱為寫鎖.
共享鎖(S鎖)
共享鎖,也可以稱為讀鎖.當一個事務對數據添加S鎖時,其他事務也可以對數據添加S鎖,即所有添加了S鎖的事務都可以同時讀取數據內容,但是無法對數據進行修改.
更改丟失
更改丟失指的是當有多個事務對數據進行操作時,有些事務的操作被其他事務所替代.
從上圖中我們可以看出 T1 事務的修改操作被 T2 事務的修改操作覆蓋了.
不可重復讀
不可重復讀指的是某一個事務執行期前其他的事務修改,插入或刪除了數據,則該事務在驗證數據時會出現與開始結果不一致的情況.
讀臟數據
讀臟數據指的是某一個事務讀取了另一個事務執行期間的數據內容,當另一個事務回滾時,該事務讀取到的內容就是無效數據.
從上圖中可以看到 T2 事務讀取到的 C 的值是一個無效的數據.
三類封鎖協議
第一類封鎖協議
第一類封鎖協議指的是在對數據進行修改操作時需要對數據添加X鎖.第一類封鎖協議相當于把數據的讀取和修改看成一個整體,在事務完成之前其他事務都不能對數據進行修改操作.因此第一類封鎖協議解決了丟失修改的問題.另外要注意如果其他事務僅是對數據進行讀取操作時無需加鎖,因此其他事務在執行過程中還是可能會出現不可重復讀和讀臟數據的情況.
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LrLk9bTH-1616841877613)(https://user-images.githubusercontent.com/41415004/112717870-4a20e400-8f2a-11eb-8547-4b4ac37ccb6e.png)]
上圖顯示了第一類封鎖協議解決丟失修改的問題.
上圖顯示了第一類封鎖協議出現的讀臟數據情況.
上圖顯示了第一類封鎖協議出現的不可重復讀情況.
第二類封鎖協議
第二類封鎖協議是在第一類封鎖協議的基礎上加入了S鎖.在讀取數據前需要對數據添加S鎖, 當數據讀取完成后釋放S鎖 .如果一個事務讀取數據并添加了S鎖,另一個事務添加了X鎖,那么添加X鎖的那個事務必須等待添加了S鎖的事務釋放S鎖后才能對數據進行修改操作.基于這個緣由第二類封鎖協議解決了讀臟數據的問題.但是第二類封鎖協議并不能解決數據的不可重復讀問題.如下圖所示.
第三類封鎖協議
第三類封鎖協議是在第一類封鎖協議的基礎上加入了S鎖,在讀取數據前需要對數據添加S鎖, 當事務結束后釋放S鎖.第三類封鎖協議同時解決了數據的修改丟失,不可重復讀和讀臟數據問題.
可重復讀
不讀臟數據
總結
| 第一類封鎖協議 | 丟失修改 | 讀臟數據,不可重復讀 |
| 第二類封鎖協議 | 丟失修改,讀臟數據 | 不可重復讀 |
| 第三類封鎖協議 | 丟失修改,讀臟數據,不可重復讀 | 無 |
聲明
本文章的所有圖片都來自于 二級封鎖協議-中國科學技術大學 的 PPT 中,如有侵權立即刪除.
總結
- 上一篇: 查询和使用3gpp技术文件编号与版本的基
- 下一篇: 【C++】日期计算器