SQLSERVER死鎖該如何深度分析

這篇文章將為大家詳細講解有關(guān)SQL SERVER死鎖該如何深度分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,明溪企業(yè)網(wǎng)站建設,明溪品牌網(wǎng)站建設,網(wǎng)站定制,明溪網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,明溪網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

說道SQL SERVER ,其實這個數(shù)據(jù)庫在企業(yè)中是廣泛使用的,這就必須提到為什么企業(yè)廣泛使用SQL SERVER ,.NET  VS  JAVA ,在開發(fā)中我們目前有兩大陣營,.NET 陣營和 JAVA 陣營,而一般來說使用.NET 開發(fā)是很愿意把 SQL SERVER 作為首選數(shù)據(jù)庫的, 尤其是在中小型企業(yè)中,開發(fā)快,出色的性能,以及各種漂亮的圖形化,讓開發(fā)和管理,變得很簡單,在講求效率的今天,企業(yè)中還是有一大部分使用.NET 及 SQL SERVER 來滿足企業(yè)的各種需求。

SQL SERVER死鎖該如何深度分析

今天想說的是SQL SERVER 中程序員,DBA ,所有人都不愿意看見的死鎖,DEAD LOCK。 出現(xiàn)這個情況,說明我們的整個系統(tǒng)在設計,以及硬件方面都可能存在一些,問題。所以我們必須要搞清楚死鎖為什么會形成。

為了讓說明變得簡單,我這邊需要創(chuàng)建一些表

CREATE TABLE Countrys

    (

             CountryID INT NOT NULL IDENTITY(1, 1)

            CONSTRAINT PK_Country PRIMARY KEY,

            CountryName VARCHAR(100),

            PopulationSize INT NOT NULL

    )

CREATE TABLE Citys

    (

            CityID INT NOT NULL IDENTITY(1, 1)

            CONSTRAINT PK_City PRIMARY KEY,

            CountryID INT NOT NULL,

           CityName VARCHAR(100) NOT NULL,

           PopulationSize INT NOT NULL,

        CountOfHospitals INT NOT NULL,

        SomeProperty1 VARCHAR(100) NOT NULL,

        SomeProperty2 VARCHAR(100) NOT NULL,

        SomeProperty3 VARCHAR(100) NOT NULL,

        SomeProperty4 VARCHAR(100) NOT NULL,

        SomeProperty5 VARCHAR(100) NOT NULL,

        SomeProperty6 VARCHAR(100) NOT NULL,

        SomeProperty7 VARCHAR(100) NOT NULL,

        SomeProperty8 VARCHAR(100) NOT NULL,

        SomeProperty9 VARCHAR(100) NOT NULL,

        SomeProperty10 VARCHAR(100) NOT NULL,

        SomeProperty11 VARCHAR(100) NOT NULL,

        SomeProperty12 VARCHAR(100) NOT NULL,

        SomeProperty13 VARCHAR(100) NOT NULL,

        SomeProperty14 VARCHAR(100) NOT NULL,

        SomeProperty15 VARCHAR(100) NOT NULL,

        SomeProperty16 VARCHAR(100) NOT NULL,

        SomeProperty17 VARCHAR(100) NOT NULL,

        SomeProperty18 VARCHAR(100) NOT NULL,

        SomeProperty19 VARCHAR(100) NOT NULL,

        SomeProperty20 VARCHAR(100) NOT NULL,

        SomeProperty21 VARCHAR(100) NOT NULL,

        SomeProperty22 VARCHAR(100) NOT NULL,

        SomeProperty23 VARCHAR(100) NOT NULL,

        SomeProperty24 VARCHAR(100) NOT NULL,

        SomeProperty25 VARCHAR(100) NOT NULL,

        SomeProperty26 VARCHAR(100) NOT NULL,

        SomeProperty27 VARCHAR(100) NOT NULL,

        SomeProperty28 VARCHAR(100) NOT NULL,

        SomeProperty29 VARCHAR(100) NOT NULL,

        SomeProperty30 VARCHAR(100) NOT NULL,

        SomeProperty31 VARCHAR(100) NOT NULL,

        SomeProperty32 VARCHAR(100) NOT NULL,

        SomeProperty33 VARCHAR(100) NOT NULL,

        SomeProperty34 VARCHAR(100) NOT NULL,

        SomeProperty35 VARCHAR(100) NOT NULL,

        SomeProperty36 VARCHAR(100) NOT NULL,

        SomeProperty37 VARCHAR(100) NOT NULL,

        SomeProperty38 VARCHAR(100) NOT NULL,

        SomeProperty39 VARCHAR(100) NOT NULL,

        SomeProperty40 VARCHAR(100) NOT NULL,

        CONSTRAINT FK_Country

            FOREIGN KEY (CountryID)

            REFERENCES dbo.Country (CountryID)

    )

GO

CREATE INDEX IDX_City_Not_Covering_Index

    ON dbo.Citys (CountryID)

    INCLUDE (CityName)

GO 

________________________________________________________ 

下面就開始變魔術(shù),請開3個REQUEST 窗口,以 1 , 2 ,3,來標記語句是在哪個窗口上執(zhí)行的

1

SQL SERVER死鎖該如何深度分析

2

SQL SERVER死鎖該如何深度分析

1

SQL SERVER死鎖該如何深度分析

2

SQL SERVER死鎖該如何深度分析

到目前為止,還么有出現(xiàn)死鎖,(死鎖怎么看,可以通過 EXEVENT 或自身  查看死鎖的腳本來看,后面會給出腳本,EXEVENT  這里就不介紹了,雖然比腳本好用多了)

1  在窗口以繼續(xù)執(zhí)行下面的腳本

INSERT INTO dbo.Citys

VALUES

    (1,          -- CountryID - int

     'New York', -- CityName - varchar(100)

     8538000,    --As Google just said and that's cool!

     1000,       --From the ceiling

        )

2 在窗口2 繼續(xù)執(zhí)行下面的腳本

INSERT INTO dbo.Citys

VALUES

    (2,        -- CountryID - int

     'Delhi',  -- CityName - varchar(100)

     19980000, --As Google just said and that's cool!

     2000,     --From the ceiling

    ) 

1 我們在窗口1  繼續(xù)查詢

SQL SERVER死鎖該如何深度分析

2 我們在窗口2 也查詢

SQL SERVER死鎖該如何深度分析

然后魔術(shù)上演,在窗口2 出現(xiàn)死鎖提示

SQL SERVER死鎖該如何深度分析

EXEVENT 中也出現(xiàn)了死鎖圖示

SQL SERVER死鎖該如何深度分析

估計有些SQL SERVER DBA 已經(jīng)清晰的明白這里發(fā)生了什么,為什么會死鎖? 如果已經(jīng)明白了,那就真的么有必要往下看了。

————————————————————————————

死鎖發(fā)生在給CITYS 表插入記錄的時候,當插入CITYS 表  "NEW YORK“的時候,給這一行加了 X 鎖,(行鎖) ,當我在插入CITYS 表 “Delhi" 時,給Delhi 這一行(應該是第二行加上了X鎖) 到目前為止,還算相安無事。

但我馬上做了一個糟糕的操作,我查詢了CITY 表,雖然我建立了索引,(這里買一個關(guān)子,好好想想,我還是用上面的操作,只需要改一個地方,就可以避免這次死鎖,和查詢的方式有關(guān))

,這是就加上了 S 鎖,而不巧的是,這個S鎖也鎖住了 "NEW YORK"和Delhi,然后就是觸發(fā)死鎖的發(fā)生最后一步,我查詢 Delhi , 而這個查詢也要給 "NEW YORK" 上一個 S 鎖,好了,由于之前每行都有 X 鎖,所以雖然行鎖可以避免對本行的 S 鎖產(chǎn)生等待,但不能對其他行避免等待,所以兩次查詢,變成了死鎖,互相等待。(估計我說完了,有人已經(jīng)暈了,畫張圖,馬上就明白了)

SQL SERVER死鎖該如何深度分析

看完圖應該明白,為什么產(chǎn)生死鎖,也明白本星期四某些故障的原因,和這個很類似,所以某些時候,并發(fā)害死人呀

其實要解決這個問題,也很簡單,但又不簡單,尤其在一個復雜的系統(tǒng)中,串行不出問題,不代表并行不會出現(xiàn)問題,大量的死鎖就是這么“神奇”的出現(xiàn)。

最后,可以通過以下腳本來,查看某些死鎖,或者鎖授予的情況。

SELECT OBJECT_NAME(p.object_id) AS TableName,

       dtl.resource_type,

       dtl.resource_description,

       --c.CityName AS Locked_Row,

       --c.CityID AS Locked_Row_ID,

       dtl.request_mode,

       dtl.request_type,

       dtl.request_status,

       dtl.request_session_id,

       dtl.request_owner_type,

       dtl.request_owner_id

FROM   sys.dm_tran_locks AS dtl

LEFT JOIN sys.partitions AS p

    ON p.hobt_id = dtl.resource_associated_entity_id

關(guān)于SQL SERVER死鎖該如何深度分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

網(wǎng)站名稱:SQLSERVER死鎖該如何深度分析
網(wǎng)頁URL:http://muchs.cn/article0/jpesio.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供域名注冊、搜索引擎優(yōu)化、、外貿(mào)網(wǎng)站建設建站公司、品牌網(wǎng)站建設

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設