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