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

創(chuàng)新互聯(lián)公司是一家專注于做網(wǎng)站、成都網(wǎng)站建設(shè)與策劃設(shè)計,敘永網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:敘永等地區(qū)。敘永做網(wǎng)站價格咨詢:18982081108
-
創(chuàng)建一個Database,名為InvDB。
-
執(zhí)行下面腳本創(chuàng)建person表并填充兩條數(shù)據(jù):
-
在SQL Server Management Studio的兩個窗口中同時執(zhí)行下面的查詢:
這段代碼在默認(rèn)的READ COMMITTED隔離級別下運行,兩個進程分別在獲取一個排它鎖的情況下,申請對方的共享鎖從而造成死鎖。
可見一個進程可以正常更新并顯示結(jié)果,而另一個進程已經(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í)行一次上面的死鎖實驗,可以看到如下所示的死鎖圖:
非常有趣的一點是:第二次執(zhí)行上述語句不會發(fā)生死鎖!這是因為此時兩個進程中,SQL Server會智能的識別出update語句是不需要做的,所以都不會去獲取排它鎖,當(dāng)然也就不會死鎖了。SQL Server 2008 的查詢優(yōu)化器還真是非常強大!
文章名稱:講解一下SQLServer死鎖問題
網(wǎng)頁鏈接:http://www.5511xx.com/article/cdiddcc.html


咨詢
建站咨詢
