前言

終于進(jìn)入死鎖系列,前面也提到過(guò)我一直對(duì)隔離級(jí)別和死鎖以及如何避免死鎖等問(wèn)題模棱兩可,所以才鼓起了重新學(xué)習(xí)SQL Server系列的勇氣,本節(jié)我們來(lái)講講SQL Server中的死鎖,看到許多文章都只簡(jiǎn)述不能這樣做,這樣做會(huì)導(dǎo)致死鎖,但是未理解其基本原理,下次遇到類(lèi)似情況依然會(huì)犯錯(cuò),所以基于了解死鎖原理并且得到治療死鎖良方,博主不惜花費(fèi)多天時(shí)間來(lái)學(xué)習(xí)死鎖最終總結(jié)出本文,若有敘述不當(dāng)之處請(qǐng)?jiān)谠u(píng)論中指出。

死鎖定義

死鎖是兩個(gè)或多個(gè)進(jìn)程互相阻塞的情況。兩個(gè)進(jìn)程死鎖的例子是,進(jìn)程A阻塞進(jìn)程B且進(jìn)程B阻塞進(jìn)程B。涉及多個(gè)進(jìn)程死鎖的例子是,進(jìn)程A阻塞進(jìn)程B,進(jìn)程B阻塞進(jìn)程C且進(jìn)程C阻塞進(jìn)程A。在任何一種情況下,SQL Server檢測(cè)到死鎖,都會(huì)通過(guò)終止其中的一個(gè)事務(wù)盡心干預(yù)。如果SQL Server不干預(yù),涉及的進(jìn)程永遠(yuǎn)陷于死鎖狀態(tài)。

除外另外指定,SQL Server選擇終止工作最少的事務(wù),因?yàn)樗阌诨貪L該事務(wù)的工作。但是,SQL Server允許用戶(hù)設(shè)置一個(gè)叫做DEADLOCK_PRIORITY的會(huì)話選項(xiàng),可以是范圍在-10~10之間的21個(gè)值中的任意值,死鎖優(yōu)先級(jí)最低的進(jìn)程將被作為犧牲對(duì)象,而不管其做了多少工作。我們可以舉一個(gè)生活中常見(jiàn)和死鎖類(lèi)似的例子,當(dāng)在車(chē)道上行駛時(shí),快到十字路口的紅燈時(shí),此時(shí)所有的小車(chē)都已經(jīng)就緒等待紅燈,當(dāng)變綠燈時(shí),此時(shí)有駕駛員發(fā)現(xiàn)走錯(cuò)了車(chē)道,于是開(kāi)始變換車(chē)道,但是別的車(chē)道都擁堵在一塊根本插不進(jìn)去,駕駛員只有等待有空隙時(shí)再插進(jìn)去,同時(shí)駕駛員車(chē)道上后面的小車(chē)又在等待駕駛員開(kāi)到別的車(chē)道。這種情況雖然不恰當(dāng),但是在一定程度上很好的表現(xiàn)了死鎖的情況,所以在開(kāi)車(chē)時(shí)盡量別吵吵,否則誰(shuí)都走不了,keep silence。

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營(yíng)銷(xiāo)培訓(xùn)

下面我們來(lái)演示常見(jiàn)的一種死鎖情況,然后我們?cè)賮?lái)討論如何減少系統(tǒng)中死鎖的發(fā)生。

讀寫(xiě)死鎖

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式