前言:
事務是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、現在來關閉事務,在第一個窗口中輸入:
分析:
上面例子中先打開一個窗口,然后建立一個新查詢。在另外一個窗口中,查詢了當前正在運行的事務。
本例中使用了下面3個DMV:
1、sys.dm_tran_session_transactions:提供視圖相關的信息,并包含了特定會話的信息。
2、sys.dm_tran_active_transactions:返回實例級別上,所以正在活動的事務信息。
3、sys.dm_tran_database_transactions:返回數據庫級別上的事務信息。
例子中使用了DB_NAME()來返回當前數據庫,作為篩選特定數據庫上的事務信息。