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