如何找到进程中涉及的锁

时间:2011-09-22 05:14:26

标签: sql-server

我正在运行一个包含大量语句的SQL事务。

该事务导致其他进程偶尔发生死锁,因此我从事务中删除了一些并不重要的事情。这些现在在交易之前单独完成。

我希望能够比较我在更改之前和之后发生的锁定,以便我可以确信更改会有所作为。

我预计之前会发生更多锁定,因为交易中有更多内容。

我可以使用任何工具吗?我可以非常轻松地获得这两种情况的SQL配置文件。

我知道像sp_who,sp_who2这样的东西,但我为这些事情而努力的事情是,这是特定时刻的快照。我想从头到尾全面了解。

2 个答案:

答案 0 :(得分:1)

您可以使用SQL Server Profiler。设置包含Lock:Acquired和Lock:Released事件的探查器跟踪。运行“之前”查询。运行“之后”查询。比较和对比所采取的锁(和锁的类型)。对于上下文,您可能仍希望同时包含一些语句或批处理事件,以查看导致每个锁定的语句。

答案 1 :(得分:0)

您可以在构建过程中使用: - sp_who2

sp_who2还接受SPID的可选参数。如果传递了spid,则sp_who2的结果仅显示正在执行的SPID的一行或多行。

有关详细信息,请查看:master.dbo.sysprocesses表

SELECT * FROM master.dbo.sysprocesses where spid=@1

下面的代码显示了当前命令的读写,以及整个SPID的读写次数。它还显示正在使用的协议(TCP,NamedPipes或共享内存)。

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