2011-09-22 45 views
1

我正在運行一個SQL事務,其中有一堆語句。我怎樣才能找到在一個過程中涉及到的鎖

該事務偶爾會導致其他進程死鎖,所以我刪除了一些並不重要的事務。這些現在是在交易之前單獨完成的。

我希望能夠比較我的更改前後SQL之間發生的鎖定,以便我可以確信更改會有所作爲。

我期望之前發生更多的鎖定,因爲事務中有更多的事情發生。

有沒有我可以使用的工具?我可以很容易地得到這兩種情況下的SQL配置文件。

我知道像sp_who,sp_who2這樣的事情,但是我爲這些事情而努力的事情是這是在特定時刻的快照。我想從頭到尾全面瞭解。

+0

嘗試死鎖故障排除的聖經:http://blogs.msdn.com/b/bartd/archive/2006/09/09/deadlock-troubleshooting_2c00_-part-1.aspx :-) – mellamokb

+0

「所以我刪除了一些的交易中不重要的東西「 - 也許你會確定'究竟'是什麼導致了鎖定......如果你的交易中沒有必要的代碼,爲什麼它首先出現在那裏? –

+0

您使用哪個SQL Server版本? –

回答

1

您可以使用SQL Server Profiler。設置一個包含Lock:Acquired和Lock:Released事件的分析器跟蹤。運行你的「之前」查詢。在查詢後運行你的「之後」。比較和對比所採取的鎖定(和鎖定類型)。對於上下文,您可能還想要也包含一些語句或批處理事件,以查看哪些語句導致每個鎖被採取。

+0

好的,是的,這聽起來相當不錯。我會看看。 – peter

+0

第一次我做了它,有一些隱藏的列我沒有選擇,所以我不能將這些鎖組合在一起,或者理解這些鎖所指的是什麼。重複... – peter

+0

仍然無法在所有情況下很好地對鎖定進行分組,但大部分情況下我都可以。我可以看到我之前和之後的差異導致我得出肯定的結論。 – peter

0

你可以在建過程中使用: - sp_who2

sp_who2也需要SPID的可選參數。如果傳遞了spid,則sp_who2的結果僅顯示正在執行的SPID的一行或多行。

的更詳細信息,您可以檢查:master.dbo.sysprocesses表

SELECT * FROM master.dbo.sysprocesses where [email protected] 

下面的代碼顯示了讀取和寫入當前命令,用數一起的讀取和寫入整個SPID。它還顯示正在使用的協議(TCP,命名管道或共享內存)。

CREATE PROCEDURE sp_who3 
(
    @SessionID int = NULL 
) 
AS 
BEGIN 
SELECT 
    SPID    = er.session_id 
    ,Status    = ses.status 
    ,[Login]   = ses.login_name 
    ,Host    = ses.host_name 
    ,BlkBy    = er.blocking_session_id 
    ,DBName    = DB_Name(er.database_id) 
    ,CommandType  = er.command 
    ,SQLStatement  = 
     SUBSTRING 
     (
      qt.text, 
      er.statement_start_offset/2, 
      (CASE WHEN er.statement_end_offset = -1 
       THEN LEN(CONVERT(nvarchar(MAX), qt.text)) * 2 
       ELSE er.statement_end_offset 
       END - er.statement_start_offset)/2 
     ) 
    ,ObjectName   = OBJECT_SCHEMA_NAME(qt.objectid,dbid) + '.' + OBJECT_NAME(qt.objectid, qt.dbid) 
    ,ElapsedMS   = er.total_elapsed_time 
    ,CPUTime   = er.cpu_time 
    ,IOReads   = er.logical_reads + er.reads 
    ,IOWrites   = er.writes 
    ,LastWaitType  = er.last_wait_type 
    ,StartTime   = er.start_time 
    ,Protocol   = con.net_transport 
    ,transaction_isolation = 
     CASE ses.transaction_isolation_level 
      WHEN 0 THEN 'Unspecified' 
      WHEN 1 THEN 'Read Uncommitted' 
      WHEN 2 THEN 'Read Committed' 
      WHEN 3 THEN 'Repeatable' 
      WHEN 4 THEN 'Serializable' 
      WHEN 5 THEN 'Snapshot' 
     END 
    ,ConnectionWrites = con.num_writes 
    ,ConnectionReads = con.num_reads 
    ,ClientAddress  = con.client_net_address 
    ,Authentication  = con.auth_scheme 
FROM sys.dm_exec_requests er 
LEFT JOIN sys.dm_exec_sessions ses 
ON ses.session_id = er.session_id 
LEFT JOIN sys.dm_exec_connections con 
ON con.session_id = ses.session_id 
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) as qt 
WHERE @SessionID IS NULL OR er.session_id = @SessionID 
AND er.session_id > 50 
ORDER BY 
    er.blocking_session_id DESC 
    ,er.session_id 

END 
+0

海報明確表示他已經熟悉sp_who2 –