一、為什么要并發(fā)控制
多端操作同一個(gè)數(shù)據(jù)庫的問題
1.2 并發(fā)控制解決的問題
1.2.1 臟讀
新增的是行
1.2.2 幻讀
修改的是原有數(shù)據(jù)的記錄
1.2.3 不可重復(fù)讀
1.2.4 數(shù)據(jù)丟失問題
并發(fā)控制、事務(wù)、封鎖 是DBMS實(shí)現(xiàn)并發(fā)控制的核心技術(shù)
二、事務(wù)調(diào)度及可串行性
2.1 事務(wù)
DBMS提供的控制數(shù)據(jù)操作的一種手段,:應(yīng)用程序員將一系列的數(shù)據(jù)庫操作組合在一起為一個(gè)整體進(jìn)行操作和控制,保證了一致性
2.1.1 事務(wù)的宏觀
事務(wù)的宏觀(應(yīng)用程序員看到的事務(wù)):一個(gè)存取或改變數(shù)據(jù)庫內(nèi)容的程序的一次執(zhí)行,或者說一個(gè)SQL組合的一次執(zhí)行被看做一個(gè)事務(wù)。
由應(yīng)用程序提出,有開始和結(jié)束,結(jié)束前需要提交或者撤銷
Begin Transcation
exec sql...
...
exec sql...
exec sql commit work | exec sql rollback work
End Transcation
一段程序語句中,可能會存在執(zhí)行循環(huán),SQL引出事務(wù),到Commit/Rollback結(jié)束事務(wù),每次重復(fù)執(zhí)行都會產(chǎn)生一個(gè)事務(wù)
2.1.2 事務(wù)的微觀
DBMS看到的事務(wù):對數(shù)據(jù)庫的一系列基本操作(讀寫)的一個(gè)整體性執(zhí)行
事務(wù)的并發(fā)執(zhí)行: 多個(gè)事務(wù)從宏觀上看是并行執(zhí)行的,但是微觀上的基本操作(R、W)是可以交叉執(zhí)行的
2.1.3 事務(wù)的特性 ACID
原子性Atomicity:一組SQL操作是不可再分的
一致性Consistency:事務(wù)開始和結(jié)束時(shí),數(shù)據(jù)庫的完整性約束都存在。比如:每個(gè)銀行賬戶>0 , 事務(wù)執(zhí)行前后都應(yīng)該>0
隔離性Isolation:多個(gè)并發(fā)事務(wù)之間的操作應(yīng)該是互不干擾,每個(gè)事務(wù)獨(dú)立運(yùn)行。
持久性:一旦提交,結(jié)果就應(yīng)該永久保存在數(shù)據(jù)庫中。及時(shí)出現(xiàn)故障也不能丟失數(shù)據(jù)
2.2 事務(wù)調(diào)度與可串行性
事務(wù)調(diào)度:一組事務(wù)的基本步驟(R\W\其他控制操作加鎖解鎖等)的一種執(zhí)行順序稱為對這組事務(wù)的一個(gè)調(diào)度。
并發(fā)(并行)調(diào)度:多個(gè)事務(wù)從宏觀上看上去是并行執(zhí)行的,但是微觀上的基本操作(RW)是可以交叉執(zhí)行的
并發(fā)調(diào)度的正確性:多個(gè)事務(wù)并發(fā)執(zhí)行結(jié)果 === 每個(gè)事物依次執(zhí)行的結(jié)果
并發(fā)調(diào)度的可串行性:一個(gè)調(diào)度的影響 === 某幾個(gè)串行調(diào)度相同,則說 可串行化的 或 具有可串行性
沖突:調(diào)度中一一對連續(xù)的動(dòng)作,如果他們順序交換,那么涉及的事務(wù)中必須要改變。
有沖突的兩個(gè)操作是不能交換次序的,沒有沖突的兩個(gè)事物是可以交換的。
事務(wù)可串行化是指對于任何兩個(gè)或多個(gè)事務(wù),
如果它們并發(fā)執(zhí)行的結(jié)果和以某個(gè)序列化的順序執(zhí)行的結(jié)果是一樣的,
那么這些事務(wù)就是可串行化的。
沖突可串行化是指對于任何兩個(gè)或多個(gè)事務(wù),
如果它們并發(fā)執(zhí)行的結(jié)果和以某個(gè)序列化的順序執(zhí)行的結(jié)果是一樣的,
且它們之間任何一個(gè)數(shù)據(jù)項(xiàng)的讀寫操作之間都沒有沖突,
那么這些事務(wù)就是沖突可串行化的。
可串行化和沖突可串行化的區(qū)別在于,
可串行化只是要求不同的事務(wù)在并發(fā)執(zhí)行和串行執(zhí)行的結(jié)果是一致的,
而沖突可串行化要求不同事務(wù)之間的數(shù)據(jù)訪問順序不能引起沖突。
2.3 沖突可串行化判定
- 構(gòu)造前驅(qū)圖(有向圖)
- 節(jié)點(diǎn)是每一個(gè)事物T。如果Ti的一個(gè)操作和Tj的一個(gè)操作發(fā)生沖突,Ti在Tj前面,則繪制一條邊,由Ti指向Tj
- 測試檢查:如果此有向圖沒沒有環(huán),那么沖突就是可串行的
三、基于封鎖的并發(fā)控制方法
鎖 是控制并發(fā)的一種手段
- 每一數(shù)據(jù)元素都有唯一的鎖
- 事務(wù)讀寫前,要獲取鎖
- 后面的事務(wù)需要等待鎖釋放
- 事務(wù)處理完成后需要釋放鎖
3.1 鎖的類型
3.1.1 共享鎖Shared Lock
多個(gè)事務(wù)可以一起用共享鎖,只能讀取,不能修改
當(dāng)數(shù)據(jù)有了排它鎖,就不能再加共享鎖
3.1.2 排它鎖Exclusive Lock
一個(gè)事務(wù)獨(dú)占排它鎖,可以修改
3.1.3 意向共享鎖 Intent Shared Lock
輔助鎖,用來表明想要加上共享鎖
3.1.4 意向排他鎖 Intent Exclusive Lock
輔助鎖,用來表明想要加上排它鎖
3.1.5 更新鎖Update Lock
也稱為 共享更新鎖,是一種介于 共享鎖&排它鎖 之間的鎖
允許多個(gè)事務(wù)讀取資源,但只允許一個(gè)事務(wù)進(jìn)行修改
同樣的,只能有一個(gè)更新鎖,有了 更行鎖 就不能加 共享鎖
3.1.6 增量鎖Incremental Lock
增量的 對 數(shù)據(jù)進(jìn)行 lock & unlock
從而減少了鎖沖突的概率,提升了并發(fā)性能
通常用于高并發(fā)場景下的資源訪問控制
3.1.7 行級鎖Row Lock
只鎖定一行行的數(shù)據(jù),而不鎖定表的數(shù)據(jù)
3.1.8 表級鎖Row Lock
鎖定整個(gè)表
3.1.9 鎖的優(yōu)先級
排它鎖 > 意向排它鎖 > 意向共享鎖 > 共享鎖
行級鎖 > 表級鎖
3.2 加鎖解鎖時(shí)機(jī)
3.3 SQL隔離級別
3.3.1 讀未提交 read uncommitted 0
可以讀取其他事務(wù)未提交的數(shù)據(jù),也就是允許臟讀
最低的隔離級別,并發(fā)性最高,但是會導(dǎo)致數(shù)據(jù)不一致問題
3.3.2 讀已提交 read committed 1
只能讀取已經(jīng)提交的數(shù)據(jù),避免了臟讀
但是在并發(fā),多個(gè)事務(wù)同時(shí)訪問一個(gè)數(shù)據(jù),可能會出現(xiàn)重復(fù)讀取的數(shù)據(jù)
3.3.3 可重復(fù)讀 repeatable read 2
讀取前,先加鎖,其他事務(wù)不能修改
避免了重復(fù)讀和臟讀
3.3.4 可串行化 serializable 3
RW都會加鎖,完全避免了并發(fā)
性能下降
封鎖的粒度:
屬性值 —> 元祖 —> 元祖集合 —> 整個(gè)關(guān)系 —> 整個(gè)DB
索引項(xiàng) —> 整個(gè)索引
3.4 封鎖協(xié)議級別
3.4.1 一級封鎖協(xié)議
修改前必須加X鎖,結(jié)束(commit or rollback) 才釋放鎖
避免丟失修改
3.4.2 二級封鎖協(xié)議
在一級的基礎(chǔ)上 + 事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖,讀完后即可釋放S鎖。
讀“臟”數(shù)據(jù)
3.4.3 三級封鎖協(xié)議
在一級的基礎(chǔ)上 + 事務(wù)T在讀取數(shù)據(jù)R之前必須先對其加S鎖,直到事務(wù)結(jié)束才釋放。
不可重復(fù)讀
3.5 兩段鎖協(xié)議
加鎖階段Growing Pahse & 解鎖階段Shrinking Phase
訪問前先申請鎖
在提交前,所有的鎖都不能釋放
在加鎖階段,任何事務(wù)不能訪問已經(jīng)加鎖的資源
銀行轉(zhuǎn)賬,雙方賬戶都鎖定,轉(zhuǎn)賬才開始
四、基于時(shí)間戳的并發(fā)控制方法
4.1 基于時(shí)間戳順序的調(diào)度規(guī)則
基于時(shí)間戳順序的調(diào)度規(guī)則是根據(jù)事務(wù)提交的時(shí)間戳順序進(jìn)行調(diào)度,即按照時(shí)間戳先后順序來決定事務(wù)執(zhí)行的順序
時(shí)間戳相同,就會導(dǎo)致死鎖
此外,如果有多個(gè)事務(wù)同時(shí)競爭多個(gè)數(shù)據(jù)項(xiàng),并且它們的時(shí)間戳相互依存,那么就可能出現(xiàn)死鎖的情況。例如,如果事務(wù)1需要修改數(shù)據(jù)項(xiàng)A和B,而事務(wù)2需要修改數(shù)據(jù)項(xiàng)B和C,而時(shí)間戳1 < 時(shí)間戳2,那么事務(wù)1會先獲得A和B的鎖,但是無法獲得C的鎖,而事務(wù)2會先獲得C的鎖,但是無法獲得B的鎖,從而導(dǎo)致死鎖的情況。
4.2 基于時(shí)間戳調(diào)度托馬斯規(guī)則
托馬斯規(guī)則要求事務(wù)按照它們的時(shí)間戳順序提交,如果一個(gè)事務(wù)想要提交,但是有其他事務(wù)正在等待或已經(jīng)占據(jù)它要修改的數(shù)據(jù)項(xiàng),那么它必須等待所有占據(jù)該數(shù)據(jù)項(xiàng)的其他事務(wù)都提交或回滾后才能提交。托馬斯規(guī)則的核心思想是通過強(qiáng)制事務(wù)按照一定的順序提交,來保證不會出現(xiàn)死鎖的情況。
五、基于有效性確認(rèn)的并發(fā)控制方法
事務(wù)操作數(shù)據(jù)前,先確認(rèn)沒有其他事務(wù)正在操作
基于有效性確認(rèn)的并發(fā)控制方法可以保證數(shù)據(jù)庫的一致性和完整性,但它也會帶來一定的性能開銷,因?yàn)樾枰獙γ總€(gè)事務(wù)所涉及到的數(shù)據(jù)項(xiàng)進(jìn)行確認(rèn)。此外,如果事務(wù)之間的競爭比較激烈,那么可能會導(dǎo)致較高的并發(fā)沖突率,影響系統(tǒng)的響應(yīng)時(shí)間和處理能力。因此,在實(shí)際應(yīng)用中,需要綜合考慮并發(fā)控制方法的安全性和效率,選擇合適的方法來滿足系統(tǒng)的需求。文章來源:http://www.zghlxwxcb.cn/news/detail-429647.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-429647.html
到了這里,關(guān)于數(shù)據(jù)庫系統(tǒng)-并發(fā)控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!