前言:
如果一個事務正在等待一些給其他事務鎖定資源。這個事務就被成為“被阻塞的事務”。反過來,引起阻塞的事務,也就是鎖定資源並造成其他事務等待的事務叫做“封鎖交易”。
長時間運行事務會阻塞其他事務和查詢,使他們等待長時間。在繁重的系統中,很多時候我們會遇到阻塞問題,如果一個事務因為阻塞未完成。會造成一些列的等待鏈。
本文將介紹如何發現並馬上解決這方面的問題。
準備工作:
本例依舊使用SQLServer2012上的AdventureWorks2012資料庫。
步驟:
1、 連到SQLServer2012的AdventureWorks2012資料庫。
2、 建立視窗並輸入: [sql] view plaincopyprint? USE AdventureWorks2012 GO SET TRANSACTION ISOLATION LEVEL REPEATABLE READ GO --開啟事務 BEGIN TRANSACTION --擷取會話ID SELECT @@SPID AS Connection1_SessionID SELECT * FROM Sales.SalesOrderDetail WHERE SalesOrderDetailID = 121316
3、 執行完之後,截圖如下:
4、 新開另外一個視窗,輸入下面代碼去開啟另外一個事務,留意UPDATE語句,將不會執行,因為在等待第二步中的事務:
[sql] view plaincopyprint? USE AdventureWorks2012 GO --開啟事務 BEGIN TRANSACTION UPDATE Sales.SalesOrderDetail SET OrderQty = 10 WHERE SalesOrderDetailID = 121316 COMMIT TRANSACTION
5、 再開啟一個事務,輸入以下代碼查詢被阻塞和正在阻塞的查詢: [sql] view plaincopyprint? SELECT R.session_id AS BlockedSessionID , S.session_id AS BlockingSessionID , Q1.text AS BlockedSession_TSQL , Q2.text AS BlockingSession_TSQL , C1.most_recent_sql_handle AS BlockedSession_SQLHandle , C2.most_recent_sql_handle AS BlockingSession_SQLHandle , S.original_login_name AS BlockingSession_LoginName , S.program_name AS BlockingSession_ApplicationName , S.host_name AS BlockingSession_HostName