• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    轉載自的一篇文章通過SQLServerProfiler來監視分析死

    來源:懂視網 責編:小采 時間:2020-11-09 15:49:36
    文檔

    轉載自的一篇文章通過SQLServerProfiler來監視分析死

    轉載自的一篇文章通過SQLServerProfiler來監視分析死:通過 SQL Server Profiler來 監視 分析 死鎖 在兩個或多個SQL Server進程中,每一個進程鎖定了其他進程試圖鎖定的資源,就會出現死鎖,例如, 進程process1對table1持有1個排它鎖(X),同時process1對table2請求1個排它鎖(X), 進程process
    推薦度:
    導讀轉載自的一篇文章通過SQLServerProfiler來監視分析死:通過 SQL Server Profiler來 監視 分析 死鎖 在兩個或多個SQL Server進程中,每一個進程鎖定了其他進程試圖鎖定的資源,就會出現死鎖,例如, 進程process1對table1持有1個排它鎖(X),同時process1對table2請求1個排它鎖(X), 進程process

    通過 SQL Server Profiler來 監視 分析 死鎖 在兩個或多個SQL Server進程中,每一個進程鎖定了其他進程試圖鎖定的資源,就會出現死鎖,例如, 進程process1對table1持有1個排它鎖(X),同時process1對table2請求1個排它鎖(X), 進程process2對table2持有1個排它

    通過SQL Server Profiler來監視分析死鎖

    在兩個或多個SQL Server進程中,每一個進程鎖定了其他進程試圖鎖定的資源,就會出現死鎖,例如,
    進程process1對table1持有1個排它鎖(X),同時process1對table2請求1個排它鎖(X),
    進程process2對table2持有1個排它鎖(X),同時process2對table1請求1個排它鎖(X)

    類似這種情況,就會出現死鎖,除非當某個外部進程斷開死鎖,否則死鎖中的兩個事務都將無限期等待下去。

    Microsoft SQL Server 數據庫引擎死鎖監視器定期檢查陷入死鎖的任務。

    如果監視器檢測到循環依賴關系,將選擇其中一個任務作為犧牲品(通常是選擇占資源比較小的進程作為犧牲品),然后終止其事務并提示錯誤1205。



    這里我們通過SQL Server Profiler來監視分析死鎖的發生過程,那樣我們就會深刻理解死鎖的成因。

    1.創建測試表。

    在 Microsoft SQL Server Management Studio上,新建一個查詢,寫創建表DealLockTest_1 & DealLockTest_2兩個表:


    腳本:

    代碼
    
    
    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->use Test
    
    --創建分析死鎖使用到的兩個表DealLockTest_1 & DealLockTest_2
    go
    Set Nocount On 
    Go
    if object_id('DealLockTest_1') Is Not Null
     Drop Table DealLockTest_1
    go
    Create Table DealLockTest_1
    (
     ID int Identity(1,1) Primary Key,
     Name nvarchar(512)
    )
    
    if object_id('DealLockTest_2') Is Not Null
     Drop Table DealLockTest_2
    go
    Create Table DealLockTest_2
    (
     ID int Identity(1,1) Primary Key,
     Name nvarchar(512)
    )
    
    Go
    
    --插入一些測試數據
    Insert Into DealLockTest_1(Name)
     Select name From sys.all_objects
    
     
    Insert Into DealLockTest_2(Name)
     Select name From sys.all_objects
    Go


    創建好表和插入測試數據后,先執行腳本代碼(因為我們不需要跟蹤該代碼),緊接著,我們就模擬兩個會話,一個會話里面包含一個事務。這里我們就新建兩個查詢,其中第一個會話,是更新DealLockTest_1表后,等待5秒鐘,更新DealLocktest_2.

    Use Test
    Go
    
     --第一個會話
     
     Begin Tran
     
     Update DealLockTest_1
     Set Name=N'test1'
     Where ID >0
     
     
     /*這里的Waitfor等待,是為了容易獲取死鎖的發生*/ 
     Waitfor Delay '00:00:05'
     
     
     Update DealLockTest_2
     Set Name=N'test2'
     Where ID >0 
     
     Commit Tran
    
    Go

    代碼寫好后,我們先不要執行代碼,接下來就寫第二個會話代碼; 第二個會話更新表的順序,剛好與第一個會話相反,是更新DealLockTest_2表后,等待5秒鐘,更新DealLocktest_1.

    Use Test
    Go
     --第二個會話
     
     Begin Tran
     
     Update DealLockTest_2
     Set Name=N'test1'
     Where ID >0
    
     /*這里的Waitfor等待,是為了容易獲取死鎖的發生*/ 
     Waitfor Delay '00:00:05' 
     
     Update DealLockTest_1
     Set Name=N'test2'
     Where ID >0 
     
     Commit Tran
    
    Go

    第二個會話代碼,也先不要執行。

    2.啟動SQL Server Profiler,創建Trace(跟蹤).

    啟動SQL Server Profiler工具(在Microsoft SQL Server Management Studio的工具菜單上就發現它),創建一個Trace,Trace屬性選擇主要是包含:

    Deadlock graph
    Lock: Deadlock
    Lock: Deadlock Chain
    RPC:Completed
    SP:StmtCompleted
    SQL:BatchCompleted
    SQL:BatchStarting

    點執行按鈕,啟動Trace。

    3.執行測試代碼&監視死鎖。

    轉到 Microsoft SQL Server Management Studio界面,執行第一個會話&第二個會話的代碼,稍稍等待5秒鐘,我們就會發現其中一個會話收到報錯消息

    我們再切換到SQL Server Profiler界面,就能發現SQL Server Profiler收到執行腳本過程發生死鎖的信息。

    OK,這里就先停止SQL Server Profiler上的“暫停跟蹤” Or "停止跟蹤"按鈕,下面我們具體分析死鎖發生過程。

    4.分析死鎖

    如下圖,我們可以看到第一個會話在SPID 54,第二個會話在SPID 55,一旦SQL Server發現死鎖,它就會確定一個優勝者,可成功執行,和另一個作為犧牲品,要回滾。

    可以到看到EventClass列中,兩條SQL:BatchCompleted事件緊跟在Lock:DealLock后面,其中一條,它就是作為犧牲品,它會被回滾.而另一條SQL:BatchCompleted將會是優勝者,成功執行。

    那么,誰是優勝者,誰是犧牲品呢? 不用著急,通過DealLock graph事件,所返回來的信息,我們可以知道結果。

    我們雖然不能明白DealLock graph圖示的含義,但通過圖中描述的關系,我們知道一些有用的信息。圖中左右兩旁橢圓形相當一個處理節點(Process Node),當鼠標移動到上面的時候,可以看到內部執行的代碼,如Insert,UPdate,Delete.有打叉的左邊橢圓形就是犧牲者,沒有打叉的右邊橢圓形是優勝者。中間兩個長方形就是一個資源節點(Resource Node),描述數據庫中的對象,如一個表、一行或一個索引。在我們當前的實例中,資源節點描述的是,在聚集索引請求獲得排它鎖(X)。橢圓形與長方形之間,帶箭頭的連線表示,處理節點與資源節點的關系,包含描述鎖的模式.

    接下來我們更詳細的看圖里面的數據說明。

    先看右邊作為優勝者的這橢圓形,我們可以看到內容包含有:

    服務器進程 ID: 服務器進程標識符 (SPID),即服務器給擁有鎖的進程分配的標識符。
    服務器批 ID: 服務器批標識符 (SBID)。
    執行上下文 ID: 執行上下文標識符 (ECID)。與指定 SPID 相關聯的給定線程的執行上下文 ID。ECID = {0,1,2,3, ...n},其中 0 始終表示主線程或父線程,并且 {1,2,3, ...n} 表示子線程。
    死鎖優先級: 進程的死鎖優先級有關可能值的詳細信息,請參閱 SET DEADLOCK_PRIORITY (Transact-SQL)。
    已用日志: 進程所使用的日志空間量。
    所有者 ID: 正在使用事務并且當前正在等待鎖的進程的事務 ID。
    事務描述符: 指向描述事務狀態的事務描述符的指針。


    這些數據描述,對于我們理解死鎖,只需要知道其中的一些就夠,除非我們在專門SQL Server機構工作,才可能要深入理解它們。

    下面我們來看左邊作為犧牲品的這橢圓形處理節點,它告訴我們以下信息:

    1.它是一個失敗的事務。(藍色的交叉表示)

    2.它是作為犧牲品的T-SQL代碼。

    3.它對右下方的資源節點有一個排它鎖(X).

    4.它對右上方的資源節點請求 一個排它鎖(X).

    我們再來看中間兩個長方形的資源節點,兩個處理節點對它們各自都使用權,來執行它們各自的代碼,同時又有對對方使用資源請求的動作,從而發生了資源的競爭。

    這也就讓我們明白死鎖發生的原因。

    這里說明下資源節點的一些信息:

    HoBT:  堆或 B 樹。 用于保護沒有聚集索引的表中的 B 樹(索引)或堆數據頁的鎖

    associated objid: 關聯的對象ID,這里只是索引關聯的對象ID.

    Index name:索引名

    讓我們再對SQL Server Profiler監視到的數據,作一次整理:

    回顧圖:

    1.在第3行SQL:BatchStarting, SPID 54 (第一個會話啟動),在索引PK__DealLock__3214EC274222D4EF獲得一個排它鎖,再處理等待狀態,(因為在這個實例中我設置了Waitfor Delay '00:00:05')

    2.在第6行SQL:BatchStarting, SPID 55 (第二個會話啟動),在索引PK__DealLock__3214EC2745F365D3獲得一個排它鎖,再處理等待狀態,(因為在這個實例中我設置了Waitfor Delay '00:00:05')

    3.兩個進程都各自獲得一個排它鎖(X),幾秒過去,它們就開始請求排它鎖。

    SPID 54 (第一個會話),先對PK__DealLock__3214EC2745F365D3請求一個排它鎖(X),但PK__DealLock__3214EC2745F365D3當前已經給SPID 55 (第二個會話)獲得。SPID 54要于等待。

    同時,

    SPID 55 (第二個會話),開始對PK__DealLock__3214EC274222D4EF請求一個排它鎖(X),但PK__DealLock__3214EC274222D4EF當前已經給SPID 54 (第一個會話)獲得。SPID 55要等待。

    這里就出現了進程阻塞,從而發生死鎖。

    4.SQL Server 檢查到這兩個進程(第一個&第二個會話)發生死鎖,并對占用資源比較少的進程,列入犧牲品名單,將它終止(Kill)。通過左右橢圓形進程節點顯示,可以發現已用日志最少的是左邊的進程節點。

    5. SPID 54 (第一個會話)被回滾(Rollback),SPID 55 (第二個會話)執行成功。

    到這里我們已算完成了,對死鎖的監視和分析。

    (注:是于其他死鎖的定義,死鎖模式,死鎖避免&預防,等等,不是本文重點,我沒有提出,網上太多這方面的文章)


    (完)


    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    轉載自的一篇文章通過SQLServerProfiler來監視分析死

    轉載自的一篇文章通過SQLServerProfiler來監視分析死:通過 SQL Server Profiler來 監視 分析 死鎖 在兩個或多個SQL Server進程中,每一個進程鎖定了其他進程試圖鎖定的資源,就會出現死鎖,例如, 進程process1對table1持有1個排它鎖(X),同時process1對table2請求1個排它鎖(X), 進程process
    推薦度:
    標簽: 文章 監控 pro
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品大白天新婚身材| 午夜精品福利视频| 久久久久国产精品| 无码国产精品一区二区免费式芒果 | 91精品国产人成网站| 国产精品免费无遮挡无码永久视频 | 国内精品久久久久久久coent| 国产精品网站在线观看| 无码久久精品国产亚洲Av影片| 久久精品无码一区二区日韩AV| 国产vA免费精品高清在线观看| 精品国产第1页| 成人精品综合免费视频| 人妻精品久久久久中文字幕69| 无夜精品久久久久久| 国精品产露脸自拍| 国产精品成人99久久久久| 久久99精品国产| 99精品久久精品一区二区| 久久99国产乱子伦精品免费| 亚洲精品字幕在线观看| 亚洲国产婷婷综合在线精品| 蜜臀精品无码AV在线播放 | 2022精品国偷自产免费观看| 国产精品网站在线观看| 国产精品久久久久久| 国产伦精品一区二区三区女| 国产成人精品天堂| 国产精品视频久久| 精品福利一区二区三| 国内精品免费在线观看 | 综合国产精品第一页| 亚洲精品线路一在线观看| 亚洲国产精品成人| 一区二区国产精品 | 国产成人vr精品a视频| 精品麻豆丝袜高跟鞋AV| 久久亚洲精品中文字幕| 精品一区二区三区东京热| 国产亚洲精品a在线无码| 国产精品第12页|