qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

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

           前言:

            事務是OLTP系統中的主要部分。它管理數據一致性和數據并發問題,當多個資源同時被讀取或者修改相同數據時,SQLServer會通過鎖定機制來確保數據庫中的數據總是處于一個有效狀態。在SQLServer中,鎖管理器是負責實現這些鎖機制。SQLServer對于不同的資源類型提供不同的鎖類型,如數據庫、文件、對象、表、區、頁和鍵。

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

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

            確定長時間運行的事務:

            長時間運行的事務會阻塞其他事務,并且引發新一輪的長時間運行事務!這將嚴重影響數據庫服務器的性能。

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

            準備工作

            本文使用SQLServer2012的示例數據庫AdventureWorks2012數據庫。

            步驟:

            1、打開SQLServer,連接到AdventureWorks2012數據庫。

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

          USE AdventureWorks2012
          GO
          BEGIN TRANSACTION
          SELECT  *
          FROM    Sales.SalesOrderHeader

            3、不關閉窗口,在新窗口中輸入以下代碼,監控當前正在運行的事務:

          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、下面是結果的截圖:

            5、現在來關閉事務,在第一個窗口中輸入:

          ROLLBACK TRANSACTION
          GO

            分析:

            上面例子中先打開一個窗口,然后建立一個新查詢。在另外一個窗口中,查詢了當前正在運行的事務。

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

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

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

            3、sys.dm_tran_database_transactions:返回數據庫級別上的事務信息。

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

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

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 咸丰县| 新兴县| 神池县| 太康县| 南澳县| 巨鹿县| 铜陵市| 隆子县| 秀山| 左云县| 诸城市| 孝感市| 孟州市| 东源县| 昌邑市| 原阳县| 玉环县| 全南县| 法库县| 华池县| 永寿县| 边坝县| 南华县| 宁化县| 环江| 阳朔县| 辽宁省| 潼关县| 昆山市| 平乐县| 德令哈市| 封开县| 紫云| 海城市| 宜章县| 安西县| 天镇县| 阜平县| 肥乡县| 浦东新区| 谷城县|