處理鎖、阻塞和死鎖(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ù)庫