數(shù)據(jù)庫(kù)什么時(shí)候會(huì)產(chǎn)生死鎖?
網(wǎng)友解答: 不鎖怕出事,鎖了又怕鎖死了?。?!數(shù)據(jù)庫(kù)由于數(shù)據(jù)存儲(chǔ)速度快,數(shù)據(jù)穩(wěn)定,結(jié)構(gòu)化的特性,被廣泛用作數(shù)據(jù)存儲(chǔ),并成為最重要,最常見(jiàn)的方式!數(shù)據(jù)庫(kù)從20世紀(jì)50年代誕生伊始,就因?yàn)橹С?/p>
不鎖怕出事,鎖了又怕鎖死了?。?!
數(shù)據(jù)庫(kù)由于數(shù)據(jù)存儲(chǔ)速度快,數(shù)據(jù)穩(wěn)定,結(jié)構(gòu)化的特性,被廣泛用作數(shù)據(jù)存儲(chǔ),并成為最重要,最常見(jiàn)的方式!
數(shù)據(jù)庫(kù)從20世紀(jì)50年代誕生伊始,就因?yàn)橹С质聞?wù)的特性得到大力的發(fā)展,最終各種數(shù)據(jù)庫(kù)諸如oracle,Sybase,mysql等關(guān)系型數(shù)據(jù)庫(kù)百花齊放,既然數(shù)據(jù)庫(kù)是因?yàn)槭聞?wù)而生,那么事務(wù)的特性又是哪些呢?簡(jiǎn)而言之就是ACID(原子性,一致性,隔離性,持久性)!
而為了保持?jǐn)?shù)據(jù)的一致性,數(shù)據(jù)庫(kù)都有了一個(gè)操作叫做加鎖!有表級(jí)鎖,行級(jí)鎖,頁(yè)面鎖!
死鎖就是說(shuō)兩個(gè)線程在爭(zhēng)同一個(gè)資源,然后互不相讓,導(dǎo)致鎖死的情況(比如兩個(gè)人從兩端走上獨(dú)木橋,然后卡死在橋中間)!
回到問(wèn)題本身,數(shù)據(jù)庫(kù)在什么時(shí)候會(huì)產(chǎn)生死鎖呢?
1,情況一:我中有你,你中有我!
事務(wù)一:兩個(gè)操作update A;update B;
事務(wù)二:兩個(gè)操作update B;update A;
線程一執(zhí)行事務(wù)一到一半的時(shí)候,鎖了A想要獲得B的鎖,與此同時(shí)事務(wù)二執(zhí)行到了鎖B,想要獲得鎖A的時(shí)候,因?yàn)榛ハ喽枷胍獙?duì)方擁有的鎖,而導(dǎo)致死鎖!
2,情況二:吃著碗里的,看著鍋里的!
A線程先查詢了一條記錄(使用了共享鎖),與此同時(shí)B線程正要修改這條記錄(使用了獨(dú)占鎖),然后A線程突然想修改這條記錄了,怎么辦呢?升級(jí)鎖。。而B(niǎo)線程想要降級(jí)為共享鎖,必須要等到A線程釋放掉共享鎖,這樣就形成了死鎖!
可以看到這個(gè)過(guò)程中是A占著共享鎖想要升級(jí),B占著獨(dú)占鎖想要降級(jí),然后卡死!
3,牽一發(fā)而動(dòng)全身!
一個(gè)表結(jié)構(gòu),必須要有適當(dāng)?shù)乃饕葍?yōu)化手段,如果在執(zhí)行事務(wù)的時(shí)候,沒(méi)有加索引條件甚至沒(méi)有任何條件,那么將執(zhí)行全表掃描,如果是多個(gè)事務(wù)在操作,很容易就發(fā)生了阻塞和死鎖!所以字段加索引非常重要??!
可以說(shuō)數(shù)據(jù)庫(kù)死鎖必然會(huì)造成很嚴(yán)重的生產(chǎn)事故,所以要盡量避免死鎖的發(fā)生,而如何避免呢?我會(huì)在后面的回答中逐一解答,敬請(qǐng)關(guān)注。。。
網(wǎng)友解答:數(shù)據(jù)庫(kù)是一個(gè)軟件,是一個(gè)很多用戶會(huì)一起使用的軟件。
當(dāng)多個(gè)用戶同時(shí)的去操作數(shù)據(jù)庫(kù)中數(shù)據(jù)的時(shí)候,在數(shù)據(jù)庫(kù)中就會(huì)產(chǎn)生多個(gè)用戶去存取同一條數(shù)據(jù)的情況。如果兩個(gè)或多個(gè)以上的用戶在執(zhí)行的過(guò)程中,因爭(zhēng)奪資源導(dǎo)致互相等待,并且將一直等待下去,這種情況叫做死鎖。
產(chǎn)生死鎖的條件一條數(shù)據(jù)每次只能被一個(gè)用戶使用。
一個(gè)用戶請(qǐng)求資源阻塞時(shí),對(duì)已經(jīng)獲得的資源保持不放
用戶已經(jīng)獲得的資源,未使用前,別人不能搶走
幾個(gè)用戶形成首尾相接的循環(huán)等待資源
幾個(gè)條件同時(shí)發(fā)生的時(shí)候,就會(huì)產(chǎn)生思索。
比如小明和小紅都要做飯,做飯需要鏟子和鍋(加入鏟子和鍋各有一個(gè))。
小明拿到了鏟子,準(zhǔn)備去找鍋。
小紅拿到了鍋,準(zhǔn)備去找鏟子。
然后他/她倆就僵持住了,每個(gè)人都拿著手上的東西不放手,于是就一直僵持下去了。
數(shù)據(jù)庫(kù)鎖類型排它鎖(X鎖):鎖上之后,其他用戶不能對(duì)其查詢和修改。
共享鎖(S鎖):鎖上之后,其他用戶可以查詢,但是不能修改。