數(shù)據(jù)庫(kù)鎖有哪幾種 為什么要為數(shù)據(jù)庫(kù)加嚴(yán)格兩階段鎖或強(qiáng)階段鎖?
為什么要為數(shù)據(jù)庫(kù)加嚴(yán)格兩階段鎖或強(qiáng)階段鎖?保證數(shù)據(jù)的絕對(duì)安全,防止被惡意篡改。庫(kù)存不夠用數(shù)據(jù)庫(kù)鎖可以嗎?是的,你可以。為了保證數(shù)據(jù)的一致性和有效性,當(dāng)數(shù)據(jù)庫(kù)高并發(fā)讀寫(xiě)資源時(shí),鎖是一個(gè)非常重要的機(jī)制。M
為什么要為數(shù)據(jù)庫(kù)加嚴(yán)格兩階段鎖或強(qiáng)階段鎖?
保證數(shù)據(jù)的絕對(duì)安全,防止被惡意篡改。
庫(kù)存不夠用數(shù)據(jù)庫(kù)鎖可以嗎?
是的,你可以。
為了保證數(shù)據(jù)的一致性和有效性,當(dāng)數(shù)據(jù)庫(kù)高并發(fā)讀寫(xiě)資源時(shí),鎖是一個(gè)非常重要的機(jī)制。Mysql鎖分為三個(gè)級(jí)別::行鎖、頁(yè)鎖和表鎖。
數(shù)據(jù)鎖庫(kù)是什么意思?
應(yīng)該是數(shù)據(jù)庫(kù)頻率。它是阻止其他事務(wù)訪問(wèn)指定資源控制,實(shí)現(xiàn)并發(fā)控制的主要手段。
鎖意味著在事務(wù)訪問(wèn)數(shù)據(jù)庫(kù)中的資源(如表和記錄)之前,它首先請(qǐng)求系統(tǒng)阻塞該資源。事務(wù)獲得鎖后,它就獲得了對(duì)數(shù)據(jù)的控制權(quán),在事務(wù)釋放其鎖之前,其他事務(wù)不能更新數(shù)據(jù)。當(dāng)事務(wù)被撤消時(shí),鎖定的資源被釋放。
關(guān)于MySQL中的表鎖和行鎖?
1.程序中的非數(shù)據(jù)庫(kù)交互導(dǎo)致事務(wù)掛起。
在SQL事務(wù)代碼中嵌入接口調(diào)用或文件操作等非數(shù)據(jù)庫(kù)交互操作,可能會(huì)導(dǎo)致整個(gè)事務(wù)掛起(接口被阻塞,等待超時(shí)或上傳下載大附件)。
2.該事務(wù)包含性能不佳的查詢SQL
事務(wù)中有一個(gè)慢速查詢,導(dǎo)致同一個(gè)事務(wù)中的其他DML無(wú)法及時(shí)釋放被占用的行鎖,導(dǎo)致行鎖等待。
3.單個(gè)事務(wù)包含大量SQL。
這通常是由于在事務(wù)代碼中添加了一個(gè)for循環(huán)造成的。雖然單個(gè)SQL運(yùn)行速度很快,但是當(dāng)SQL數(shù)量很大時(shí),事務(wù)會(huì)很慢。
4.級(jí)聯(lián)更新SQL需要很長(zhǎng)時(shí)間來(lái)執(zhí)行。
這種SQL很容易給人錯(cuò)覺(jué)。例如,級(jí)聯(lián)更新如更新一個(gè)集合...where (select B)不僅會(huì)占用表A上的行鎖,還會(huì)占用表B上的行鎖,當(dāng)SQL長(zhǎng)時(shí)間執(zhí)行時(shí),很容易導(dǎo)致表B上的行鎖等待。
5.由于磁盤(pán)問(wèn)題,交易暫停
在極少數(shù)情況下,比如存儲(chǔ)突然下線,SQL執(zhí)行會(huì)卡在內(nèi)核調(diào)用磁盤(pán)這一步,無(wú)法提交事務(wù)。
綜上所述,可以看出,如果長(zhǎng)時(shí)間不提交事務(wù),并且事務(wù)中包含DML操作,可能會(huì)有行鎖等待,從而導(dǎo)致錯(cuò)誤。
都有什么情況會(huì)導(dǎo)致數(shù)據(jù)庫(kù)鎖表呢?
數(shù)據(jù)庫(kù)鎖定表:在數(shù)據(jù)庫(kù)中,相同的數(shù)據(jù)可能被多個(gè)人讀取或更改。為了防止其他人同時(shí)更改它,一般需要將此處的表鎖定,以防止其他人更改。當(dāng)然,還有其他復(fù)雜的情況。
數(shù)據(jù)庫(kù)鎖分為共享鎖、有意鎖和排他鎖。從鎖粒度的角度來(lái)看,可以分為獲取行、頁(yè)鍵、鍵范圍、索引、表或數(shù)據(jù)庫(kù)的鎖。(鎖粒度是被阻塞目標(biāo)的大小。小的阻塞粒度導(dǎo)致高并發(fā)性,但開(kāi)銷也高。大的阻塞粒度導(dǎo)致低并發(fā)性但低開(kāi)銷。)
可能的原因有:
(1)沒(méi)有索引ec的字段當(dāng)執(zhí)行一個(gè)事務(wù)時(shí),如果表中沒(méi)有索引,它將掃描整個(gè)表。如果此時(shí)有其他事務(wù)過(guò)來(lái),表就會(huì)被鎖定!
(2):的交易處理時(shí)間長(zhǎng)。當(dāng)越來(lái)越多的事務(wù)堆積起來(lái),就會(huì)發(fā)生表鎖!
(3)關(guān)聯(lián)操作太多。:涉及許多表格的修改。并發(fā)量大的時(shí)候會(huì)鎖死大量的表數(shù)據(jù)!
表鎖的解決方案是:
(1)是否被鎖定,鎖定的數(shù)據(jù)可以通過(guò)相關(guān)的sql語(yǔ)句查詢出來(lái)!
(2)鎖的時(shí)間限制,防止無(wú)限死鎖!
(3)添加索引,避免掃描整個(gè)表!
(4)嘗試順序操作數(shù)據(jù)!
(5)根據(jù)引擎選擇合理的鎖粒度!
(6)交易中的處理時(shí)間盡量短!
生產(chǎn)中的死鎖是一個(gè)很嚴(yán)重的問(wèn)題,因?yàn)樗梨i通常沒(méi)有明顯的錯(cuò)誤日志,發(fā)現(xiàn)錯(cuò)誤只能后知后覺(jué)的處理,所以一定要盡量避免!
擴(kuò)展數(shù)據(jù):
阻塞意味著一個(gè)事務(wù)T在操作一個(gè)數(shù)據(jù)對(duì)象(比如一個(gè)表或記錄)之前向系統(tǒng)發(fā)送一個(gè)鎖定它的請(qǐng)求。鎖定后,事務(wù)T對(duì)數(shù)據(jù)對(duì)象有一定的控制權(quán),在事務(wù)T釋放它的鎖之前,其他事務(wù)不能更新數(shù)據(jù)對(duì)象。
鎖表的基本類型有:
(1)獨(dú)占鎖(標(biāo)記為X鎖)
排他鎖也稱為寫(xiě)鎖。如果事務(wù)T用X鎖定數(shù)據(jù)對(duì)象A,那么只有T被允許讀取和修改A,在T釋放對(duì)A的鎖定之前,任何其他事務(wù)都不能用任何類型鎖定A..
(2)共享鎖(標(biāo)記為S鎖)
共享鎖也稱為讀鎖。如果事務(wù)T用S鎖定數(shù)據(jù)對(duì)象A,其他事務(wù)只能用S鎖定A,而不能用X,直到T釋放A上的S鎖..X鎖和S鎖都被添加到數(shù)據(jù)對(duì)象中。
阻擋單元是:
被阻塞的對(duì)象可以是邏輯單元或物理單元。
邏輯單元:屬性值、屬性值集、元組、關(guān)系、索引項(xiàng)、整個(gè)索引、整個(gè)數(shù)據(jù)庫(kù)等。
物理單位:頁(yè)(數(shù)據(jù)頁(yè)或索引頁(yè))、塊等。
阻塞對(duì)象可大可小,比如鎖定整個(gè)數(shù)據(jù)庫(kù)或鎖定一個(gè)屬性值。被阻塞對(duì)象的大小稱為塊的粒度。阻塞粒度越大,系統(tǒng)中可以阻塞的對(duì)象越少,并發(fā)越小,但系統(tǒng)開(kāi)銷也越小;阻塞粒度越小,并發(fā)性越高,但開(kāi)銷也越高。
在選擇阻塞粒度時(shí),我們必須同時(shí)考慮成本和并發(fā)性,做出權(quán)衡以獲得最佳效果。
總的原則是:
(1)需要處理大量元組的用戶事務(wù):關(guān)系是阻塞單元;
(2)需要處理大量多元關(guān)系元組的用戶事務(wù):以數(shù)據(jù)庫(kù)為分塊單位;
(3)只處理元組數(shù)量少的用戶事務(wù):以元組為分塊單位。
加入測(cè)試材料: