新聞中心
死鎖不僅在個(gè)人學(xué)習(xí)中,甚至在開發(fā)中也并不常見。但是一旦出現(xiàn)死鎖,后果將非常嚴(yán)重。 首先什么是死鎖呢?打個(gè)比方,就好像有兩個(gè)人打架,互相限制住了(鎖住,抱住)彼此一樣,互相動彈不得,而且互相歐氣,你不松手我就不松手。好了誰也動彈不得。 在多線程的環(huán)境下,勢必會對資源進(jìn)行搶奪。當(dāng)兩個(gè)線程鎖住了當(dāng)前資源,但都需要對方的資源才能進(jìn)行下一步操作,這個(gè)時(shí)候兩方就會一直等待對方的資源釋放。這就形成了死鎖。這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖進(jìn)程。

創(chuàng)新互聯(lián)公司是一家專注于做網(wǎng)站、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),敘永網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:敘永等地區(qū)。敘永做網(wǎng)站價(jià)格咨詢:18982081108
-
創(chuàng)建一個(gè)Database,名為InvDB。
-
執(zhí)行下面腳本創(chuàng)建person表并填充兩條數(shù)據(jù):
-
在SQL Server Management Studio的兩個(gè)窗口中同時(shí)執(zhí)行下面的查詢:
這段代碼在默認(rèn)的READ COMMITTED隔離級別下運(yùn)行,兩個(gè)進(jìn)程分別在獲取一個(gè)排它鎖的情況下,申請對方的共享鎖從而造成死鎖。
可見一個(gè)進(jìn)程可以正常更新并顯示結(jié)果,而另一個(gè)進(jìn)程已經(jīng)被回滾:
(1 row(s) affected) Msg 1205, Level 13, State 45, Line 8 Transaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
-
啟動 SQL Server Profiler,選擇下面4種Events:
-
再執(zhí)行一次上面的死鎖實(shí)驗(yàn),可以看到如下所示的死鎖圖:
非常有趣的一點(diǎn)是:第二次執(zhí)行上述語句不會發(fā)生死鎖!這是因?yàn)榇藭r(shí)兩個(gè)進(jìn)程中,SQL Server會智能的識別出update語句是不需要做的,所以都不會去獲取排它鎖,當(dāng)然也就不會死鎖了。SQL Server 2008 的查詢優(yōu)化器還真是非常強(qiáng)大!
本文標(biāo)題:講解一下SQLServer死鎖問題
轉(zhuǎn)載來源:http://m.5511xx.com/article/cdiddcc.html


咨詢
建站咨詢
