網(wǎng)站首頁 編程語言 正文
剖析數(shù)據(jù)庫中重要而又常被曲解的概念
- 排他鎖
- 共享鎖
- 意向鎖
- 粒度樹
- 意向鎖
- 兩段鎖協(xié)議
- 一級封鎖協(xié)議
- 二級封鎖協(xié)議
- 三級封鎖協(xié)議
- 臟讀
- 不可重復讀
- 幻影行
- 可串行化
排他鎖
- 排他鎖(exclusive locks):指的滿足此條件的鎖:當某事務對某數(shù)據(jù)加上排他鎖之后,直到該事務釋放這個鎖之前,其它事務不能再對這個數(shù)據(jù)再加排他鎖和共享鎖。
共享鎖
- 共享鎖(share locks):指的滿足此條件的鎖:當某事務對某數(shù)據(jù)加上共享鎖之后,直到所有事務都釋放了對該數(shù)據(jù)加上的共享鎖之前,任何事務都不能對該數(shù)據(jù)加上排他鎖,但可以對其加共享鎖。
【注意】
??排他鎖、共享鎖本身是無法直接限制事務對數(shù)據(jù)的讀取和修改的。之所以看起來它們能夠控制對數(shù)據(jù)的讀取和修改,這需要依賴每個事務在讀取和修改數(shù)據(jù)之前必須要遵守某種約定,這就是:如果要求在某些條件下,某事務需要加某種鎖才能對數(shù)據(jù)進行操作,那么,所有其它事務在遇到同樣情況下,也強制必須先加鎖才能對數(shù)據(jù)進行操作,如果加鎖加失敗,則該事務需要等待。而鎖之間是有排斥法則的,所以可以通過這個法則來間接實現(xiàn)對數(shù)據(jù)讀取和修改上的限制。
??排他鎖對應的要求條件往往是在對數(shù)據(jù)的修改之前,共享鎖對應的則是讀取。也就是說,如果對事務啟用排他鎖,往往意味著,任何事務在修改數(shù)據(jù)之前都要先加排他鎖。如果對事務啟用共享鎖,往往意味著任何事務在讀取數(shù)據(jù)之前都要先加共享鎖。不過,可以自行規(guī)定加鎖時機。
意向鎖
??介紹這個概念之前,需要知道什么是粒度樹。
粒度樹
- 粒度樹:不同資源在概念上的包含關系稱為粒度。不同資源之間的概念粒度會有不同,如行的粒度與表的粒度就有不同。一個資源可以分為粒度更小的資源。按照資源之間的包含關系所建立的樹狀結(jié)構(gòu)稱為粒度樹。
意向鎖
-
意向鎖:對粒度樹中的某一個結(jié)點加意向鎖時,代表這個結(jié)點下至少有一個子孫結(jié)點將要被加上
排他鎖
或共享鎖
。
【提示】
??意向鎖是為了減少對多粒度資源加
排他鎖
或共享鎖
時的開銷。
兩段鎖協(xié)議
-
兩段鎖(Two Phase Locking,簡稱 2PL)協(xié)議:當一個事務需要對很多資源加鎖時,如果對這些資源的加鎖順序可分為如下兩個階段,則稱其符合兩段鎖協(xié)議:
-
拓展階段:只進行加鎖,不進行釋放鎖。
-
收縮階段:只釋放鎖,不進行加鎖。
如果該事務對這些資源進行適當分組,使得對每一組的加鎖順序都符合兩段鎖協(xié)議,則稱該事務對整個資源的加鎖順序也符合兩段鎖協(xié)議。
【提示】
??事務調(diào)度遵守兩段鎖協(xié)議時,一定滿足可串行化,但遵守兩段鎖協(xié)議不是滿足可串行化的充要條件。
-
一級封鎖協(xié)議
-
一級封鎖協(xié)議:規(guī)定:任何事務在修改數(shù)據(jù)之前,必須先對其加本事務結(jié)束才會釋放的排他鎖,然后在加鎖成功之后才能修改數(shù)據(jù)。
一級封鎖協(xié)議不能防止臟讀、不可重復讀。
二級封鎖協(xié)議
-
二級封鎖協(xié)議:規(guī)定:任何事務除了要遵守一級封鎖協(xié)議之外,還應該遵守:在讀取數(shù)據(jù)之前,
-
如果自己已經(jīng)對該數(shù)據(jù)加上了排他鎖或共享鎖,則直接讀取數(shù)據(jù),不再額外加鎖。
-
如果自己此時沒有對該數(shù)據(jù)加上排他鎖或共享鎖,則必須先對其加共享鎖,然后在加鎖成功之后才能讀取數(shù)據(jù),不過在讀取完數(shù)據(jù)之后就釋放共享鎖。
二級封鎖協(xié)議不能防止不可重復讀。
-
三級封鎖協(xié)議
-
三級封鎖協(xié)議:規(guī)定:任何事務除了要遵守一級封鎖協(xié)議之外,還應該遵守:在讀取數(shù)據(jù)之前,
-
如果自己已經(jīng)對該數(shù)據(jù)加上了排他鎖或共享鎖,則直接讀取數(shù)據(jù),不再額外加鎖。
-
如果自己此時沒有對該數(shù)據(jù)加上排他鎖或共享鎖,則必須先對其加本事務結(jié)束才會釋放的共享鎖,然后在加鎖成功之后才能讀取數(shù)據(jù)。
三級封鎖協(xié)議可以防止臟讀、不可重復讀,但不能防止舊讀。
-
臟讀
-
臟讀(dirty read):如果一個事務在讀取數(shù)據(jù)之前,讀到的是某事務在修改后、但提交之前的數(shù)據(jù),這稱為臟讀。
【注意】
??如果某事務讀取到的數(shù)據(jù)是歷史時期的某個一致性狀態(tài)下的數(shù)據(jù),這不能稱之為
臟讀
,這應該叫做舊讀。臟讀
讀出來的數(shù)據(jù)是一個處于中間狀態(tài)下的數(shù)據(jù),這種數(shù)據(jù)是沒有意義的。而舊讀
讀出來的數(shù)據(jù)是一種曾經(jīng)的正確數(shù)據(jù),使用這種數(shù)據(jù)有可能會導致問題,有可能不會。
不可重復讀
- 不可重復讀(nonrepeatable read):在上一次查詢之后,如果本事務沒有主動變更數(shù)據(jù),當本事務再次以相同的條件查詢數(shù)據(jù)時,得到的數(shù)據(jù)與上一次不一致。(變更指更新、插入、刪除,但不包括查找)
幻影行
-
幻影行(phantom row):對于不同的數(shù)據(jù)庫,可以是以下定義之一。
-
在上一次查詢之后,如果本事務沒有主動變更數(shù)據(jù),當本事務再次以相同的條件查詢數(shù)據(jù)時,與上一次相比,數(shù)據(jù)的個數(shù)發(fā)生了變化。(變更指更新、插入、刪除,但不包括查找)
在這個定義中,幻影行屬于不可重復讀的范疇。
-
滿足以下條件之一即視為出現(xiàn)了幻影行:
-
某事務連續(xù)以相同的條件查詢數(shù)據(jù)時,查詢的結(jié)果不全相同。(連續(xù)指的是查詢操作中沒有夾雜其它操作)
-
本次變更數(shù)據(jù)時,涉及變更前的查詢中不存在的數(shù)據(jù),但此操作沒有引發(fā)異常,而是成功變更了該數(shù)據(jù)。隨后本事務再次以相同的條件查詢數(shù)據(jù)時,與上一次查詢相比,數(shù)據(jù)的個數(shù)發(fā)生了變化。(變更指更新、插入、刪除,但不包括查找)
在這個定義中,幻影行不一定屬于不可重復讀。
-
-
【注意】
??不可重復讀、幻影行描述的都是同一事務的操作。
-
如果一個事務已經(jīng)結(jié)束,然后又開啟新的事務,此時這兩個事務分別的查詢結(jié)果不能用于證明事務是否滿足不可重復讀、幻影行。
很多情況都會導致事務結(jié)束,如事務的提交、回滾、執(zhí)行 DDL 語句、客戶端斷開等等。
-
同一事務要求當前正在觀測的事務不能結(jié)束,否則該事務結(jié)束之后的操作就不能隸屬于同一事務。但這僅限于這正在被觀測的事務,其它事務是可以任意開啟、隨時結(jié)束,這不影響對同一事務的要求。
可串行化
-
可串行化(Serializable):如果一種調(diào)度事務執(zhí)行的策略,使得每次多個事務并發(fā)執(zhí)行時,其執(zhí)行結(jié)果如果屬于下面這個執(zhí)行結(jié)果集中的任何一個結(jié)果,就認為這種調(diào)度策略滿足可串行化。
-
任意排列這些事務的執(zhí)行次序。
-
令這些事務依次執(zhí)行,且上一次事務執(zhí)行完,下一個事務才能執(zhí)行。
-
原文鏈接:https://blog.csdn.net/wangpaiblog/article/details/122780648
相關推薦
- 2022-11-19 C語言結(jié)構(gòu)體成員賦值的深拷貝與淺拷貝詳解_C 語言
- 2023-04-02 深入分析Golang?Server源碼實現(xiàn)過程_Golang
- 2022-05-13 python魔法方法之__setattr__()_python
- 2022-06-08 FreeRTOS編碼標準及風格指南_操作系統(tǒng)
- 2022-09-05 Verilog 之并行,數(shù)據(jù)類型,操作符號等相關基礎歸納
- 2023-01-05 Kotlin協(xié)程Job生命周期結(jié)構(gòu)化并發(fā)詳解_Android
- 2022-07-15 python向量化與for循環(huán)耗時對比分析_python
- 2022-03-15 pipe-platform-ops SpringCloudAlibaba日志鏈路追蹤和日志查詢系統(tǒng)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支