qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          處理鎖、阻塞和死鎖(1)——確定長時間運(yùn)行的事務(wù)

           前言:

            事務(wù)是OLTP系統(tǒng)中的主要部分。它管理數(shù)據(jù)一致性和數(shù)據(jù)并發(fā)問題,當(dāng)多個資源同時被讀取或者修改相同數(shù)據(jù)時,SQLServer會通過鎖定機(jī)制來確保數(shù)據(jù)庫中的數(shù)據(jù)總是處于一個有效狀態(tài)。在SQLServer中,鎖管理器是負(fù)責(zé)實(shí)現(xiàn)這些鎖機(jī)制。SQLServer對于不同的資源類型提供不同的鎖類型,如數(shù)據(jù)庫、文件、對象、表、區(qū)、頁和鍵。

            當(dāng)你使用事務(wù)時,依然會遇到由事務(wù)引起的問題,這些通常是由于鎖、阻塞和死鎖引起的。

            本系列將講解這三部分的概念。

            確定長時間運(yùn)行的事務(wù):

            長時間運(yùn)行的事務(wù)會阻塞其他事務(wù),并且引發(fā)新一輪的長時間運(yùn)行事務(wù)!這將嚴(yán)重影響數(shù)據(jù)庫服務(wù)器的性能。

            作為DBA,你需要經(jīng)常監(jiān)控服務(wù)器的事務(wù),當(dāng)你發(fā)現(xiàn)有長運(yùn)行的事務(wù)時,需要使用必須的步驟糾正。本文將講解通過事務(wù)的持續(xù)時間去監(jiān)控這些事務(wù),如果經(jīng)常找到一些事務(wù)持續(xù)時間很長,你可能需要查找是否被其他事務(wù)阻塞了,或者深入研究事務(wù)的語句是否有問題。

            準(zhǔn)備工作

            本文使用SQLServer2012的示例數(shù)據(jù)庫AdventureWorks2012數(shù)據(jù)庫。

            步驟:

            1、打開SQLServer,連接到AdventureWorks2012數(shù)據(jù)庫。

            2、輸入以下腳本,使其開啟一個簡單的事務(wù):

          USE AdventureWorks2012
          GO
          BEGIN TRANSACTION
          SELECT  *
          FROM    Sales.SalesOrderHeader

            3、不關(guān)閉窗口,在新窗口中輸入以下代碼,監(jiān)控當(dāng)前正在運(yùn)行的事務(wù):

          SELECT  ST.transaction_id AS TransactionID ,
                  DB_NAME(DT.database_id) AS DatabaseName ,
                  AT.transaction_begin_time AS TransactionStartTime ,
                  DATEDIFF(SECOND, AT.transaction_begin_time, GETDATE()) AS TransactionDuration ,
                  CASE AT.transaction_type
                    WHEN 1 THEN 'Read/Write Transaction'
                    WHEN 2 THEN 'Read-Only Transaction'
                    WHEN 3 THEN 'System Transaction'
                    WHEN 4 THEN 'Distributed Transaction'
                  END AS TransactionType ,
                  CASE AT.transaction_state
                    WHEN 0 THEN 'Transaction Not Initialized'
                    WHEN 1 THEN 'Transaction Initialized & Not Started'
                    WHEN 2 THEN 'Active Transaction'
                    WHEN 3 THEN 'Transaction Ended'
                    WHEN 4 THEN 'Distributed Transaction Initiated Commit Process'
                    WHEN 5 THEN 'Transaction in Prepared State & Waiting Resolution'
                    WHEN 6 THEN 'Transaction Committed'
                    WHEN 7 THEN 'Transaction Rolling Back'
                    WHEN 8 THEN 'Transaction Rolled Back'
                  END AS TransactionState
          FROM    sys.dm_tran_session_transactions AS ST
                  INNER JOIN sys.dm_tran_active_transactions AS AT ON ST.transaction_id = AT.transaction_id
                  INNER JOIN sys.dm_tran_database_transactions AS DT ON ST.transaction_id = DT.transaction_id
          ORDER BY TransactionStartTime
          GO

            4、下面是結(jié)果的截圖:

            5、現(xiàn)在來關(guān)閉事務(wù),在第一個窗口中輸入:

          ROLLBACK TRANSACTION
          GO

            分析:

            上面例子中先打開一個窗口,然后建立一個新查詢。在另外一個窗口中,查詢了當(dāng)前正在運(yùn)行的事務(wù)。

            本例中使用了下面3個DMV:

            1、sys.dm_tran_session_transactions:提供視圖相關(guān)的信息,并包含了特定會話的信息。

            2、sys.dm_tran_active_transactions:返回實(shí)例級別上,所以正在活動的事務(wù)信息。

            3、sys.dm_tran_database_transactions:返回數(shù)據(jù)庫級別上的事務(wù)信息。

            例子中使用了DB_NAME()來返回當(dāng)前數(shù)據(jù)庫,作為篩選特定數(shù)據(jù)庫上的事務(wù)信息。

          posted on 2013-03-26 11:12 順其自然EVO 閱讀(376) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄數(shù)據(jù)庫

          <2013年3月>
          242526272812
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宾阳县| 黄浦区| 木里| 剑河县| 曲松县| 韩城市| 太和县| 尼木县| 南京市| 马龙县| 呼图壁县| 韩城市| 拉孜县| 沙雅县| 茌平县| 雅安市| 贵阳市| 临洮县| 宜宾市| 遵义市| 六安市| 屏边| 巴青县| 西乌珠穆沁旗| 屏东市| 昌都县| 孝义市| 孝昌县| 罗平县| 山东省| 昌平区| 栾川县| 蛟河市| 高邮市| 延庆县| 高雄市| 太仓市| 珠海市| 华容县| 金沙县| 赤壁市|