国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > MySQL > 正文

mysql數(shù)據(jù)庫(kù)鎖的產(chǎn)生原因及解決辦法

2024-07-24 12:45:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

數(shù)據(jù)庫(kù)和操作系統(tǒng)一樣,是一個(gè)多用戶使用的共享資源。當(dāng)多個(gè)用戶并發(fā)地存取數(shù)據(jù) 時(shí),在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)事務(wù)同時(shí)存取同一數(shù)據(jù)的情況。若對(duì)并發(fā)操作不加控制就可能會(huì)讀取和存儲(chǔ)不正確的數(shù)據(jù),破壞數(shù)據(jù)庫(kù)的一致性。加鎖是實(shí)現(xiàn)數(shù)據(jù)庫(kù)并 發(fā)控制的一個(gè)非常重要的技術(shù)。在實(shí)際應(yīng)用中經(jīng)常會(huì)遇到的與鎖相關(guān)的異常情況,當(dāng)兩個(gè)事務(wù)需要一組有沖突的鎖,而不能將事務(wù)繼續(xù)下去的話,就會(huì)出現(xiàn)死鎖,嚴(yán) 重影響應(yīng)用的正常執(zhí)行。

在數(shù)據(jù)庫(kù)中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當(dāng)數(shù)據(jù)對(duì)象被加上排它鎖時(shí),其他的事務(wù)不能對(duì)它讀取和修改。加了共享鎖的數(shù)據(jù)對(duì)象可以被其他事務(wù)讀取,但不能修改。數(shù)據(jù)庫(kù)利用這兩 種基本的鎖類型來(lái)對(duì)數(shù)據(jù)庫(kù)的事務(wù)進(jìn)行并發(fā)控制。

死鎖的第一種情況

一個(gè)用戶A 訪問(wèn)表A(鎖住了表A),然后又訪問(wèn)表B;另一個(gè)用戶B 訪問(wèn)表B(鎖住了表B),然后企圖訪問(wèn)表A;這時(shí)用戶A由于用戶B已經(jīng)鎖住表B,它必須等待用戶B釋放表B才能繼續(xù),同樣用戶B要等用戶A釋放表A才能繼續(xù),這就死鎖就產(chǎn)生了。

解決方法:

這種死鎖比較常見(jiàn),是由于程序的BUG產(chǎn)生的,除了調(diào)整的程序的邏輯沒(méi)有其它的辦法。仔細(xì)分析程序的邏輯,對(duì)于數(shù)據(jù)庫(kù)的多表操作時(shí),盡量按照相同的順序進(jìn) 行處理,盡量避免同時(shí)鎖定兩個(gè)資源,如操作A和B兩張表時(shí),總是按先A后B的順序處理, 必須同時(shí)鎖定兩個(gè)資源時(shí),要保證在任何時(shí)刻都應(yīng)該按照相同的順序來(lái)鎖定資源。

死鎖的第二種情況

用戶A查詢一條紀(jì)錄,然后修改該條紀(jì)錄;這時(shí)用戶B修改該條紀(jì)錄,這時(shí)用戶A的事務(wù)里鎖的性質(zhì)由查詢的共享鎖企圖上升到獨(dú)占鎖,而用戶B里的獨(dú)占鎖由于A 有共享鎖存在所以必須等A釋放掉共享鎖,而A由于B的獨(dú)占鎖而無(wú)法上升的獨(dú)占鎖也就不可能釋放共享鎖,于是出現(xiàn)了死鎖。這種死鎖比較隱蔽,但在稍大點(diǎn)的項(xiàng) 目中經(jīng)常發(fā)生。如在某項(xiàng)目中,頁(yè)面上的按鈕點(diǎn)擊后,沒(méi)有使按鈕立刻失效,使得用戶會(huì)多次快速點(diǎn)擊同一按鈕,這樣同一段代碼對(duì)數(shù)據(jù)庫(kù)同一條記錄進(jìn)行多次操 作,很容易就出現(xiàn)這種死鎖的情況。

解決方法:

1、對(duì)于按鈕等控件,點(diǎn)擊后使其立刻失效,不讓用戶重復(fù)點(diǎn)擊,避免對(duì)同時(shí)對(duì)同一條記錄操作。
2、使用樂(lè)觀鎖進(jìn)行控制。樂(lè)觀鎖大多是基于數(shù)據(jù)版本(Version)記錄機(jī)制實(shí)現(xiàn)。即為數(shù)據(jù)增加一個(gè)版本標(biāo)識(shí),在基于數(shù)據(jù)庫(kù)表的版本解決方案中,一般是 通過(guò)為數(shù)據(jù)庫(kù)表增加一個(gè)“version”字段來(lái)實(shí)現(xiàn)。讀取出數(shù)據(jù)時(shí),將此版本號(hào)一同讀出,之后更新時(shí),對(duì)此版本號(hào)加一。此時(shí),將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù) 據(jù)庫(kù)表對(duì)應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對(duì),如果提交的數(shù)據(jù)版本號(hào)大于數(shù)據(jù)庫(kù)表當(dāng)前版本號(hào),則予以更新,否則認(rèn)為是過(guò)期數(shù)據(jù)。樂(lè)觀鎖機(jī)制避免了長(zhǎng)事務(wù)中的數(shù)據(jù) 庫(kù)加鎖開(kāi)銷(用戶A和用戶B操作過(guò)程中,都沒(méi)有對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)加鎖),大大提升了大并發(fā)量下的系統(tǒng)整體性能表現(xiàn)。Hibernate 在其數(shù)據(jù)訪問(wèn)引擎中內(nèi)置了樂(lè)觀鎖實(shí)現(xiàn)。需要注意的是,由于樂(lè)觀鎖機(jī)制是在我們的系統(tǒng)中實(shí)現(xiàn),來(lái)自外部系統(tǒng)的用戶更新操作不受我們系統(tǒng)的控制,因此可能會(huì)造 成臟數(shù)據(jù)被更新到數(shù)據(jù)庫(kù)中。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉溪市| 大兴区| 安新县| 齐齐哈尔市| 新余市| 得荣县| 南漳县| 鄄城县| 益阳市| 察雅县| 中阳县| 昌邑市| 平利县| 达州市| 柳林县| 金川县| 顺昌县| 政和县| 凌云县| 神池县| 大足县| 南通市| 高陵县| 秀山| 宁城县| 磴口县| 隆尧县| 张家界市| 镇平县| 连云港市| 南昌县| 明光市| 独山县| 汕头市| 峨边| 五大连池市| 朝阳区| 太谷县| 曲麻莱县| 满洲里市| 商都县|