Mar*_*lli 3 sql-server dmv blocking
我有一个程序可以让我查看 sql server 中当前正在运行的内容。
此过程不使用 sys.sysprocess,因为它已被弃用。
但是,我正在努力寻找有关导致阻塞的休眠进程所需的信息。
这是因为 DMV sys.dm_exec_requests不保存任何休眠进程的请求。
我不想使用sp_whoisactive或任何监视工具。sp_whoisactive 使用 sys.sysprocesses。
我的会议 81:
BEGIN TRANSACTION T1
SELECT @@TRANCOUNT
update
[TableBackups].[dbo].[spstats]
set execution_count = 1000
where dbname = 'master'
select @@spid
Run Code Online (Sandbox Code Playgroud)
我的会话 51:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SELECT TOP 1000 *
FROM [TableBackups].[dbo].[spstats]
WITH (HOLDLOCK)
Run Code Online (Sandbox Code Playgroud)
上述 2 个会话同时运行,因此会话 81 阻塞了会话 51。
我在下面有这个选择,它获取有关会话 81 的信息,但是,我无法获取 dbid,并且我不确定 Open_transactions 和整个等待信息。
SELECT es.session_id AS session_id
,COALESCE(es.original_login_name, 'No Info') AS login_name
,COALESCE(es.host_name,'No Info') AS hostname
,COALESCE(es.last_request_end_time,es.last_request_start_time) AS last_batch
,es.status
,COALESCE(er.blocking_session_id,0) AS blocked_by
,COALESCE(er.wait_type,'MISCELLANEOUS') AS waittype
,COALESCE(er.wait_time,0) AS waittime
,COALESCE(er.last_wait_type,'MISCELLANEOUS') AS lastwaittype
,COALESCE(er.wait_resource,'') AS waitresource
,coalesce(db_name(er.database_id),'No Info') as dbid
,COALESCE(er.command,'AWAITING COMMAND') AS cmd
,sql_text=st.text
,transaction_isolation =
CASE es.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
,COALESCE(es.cpu_time,0)
+ COALESCE(er.cpu_time,0) AS cpu
,COALESCE(es.reads,0)
+ COALESCE(es.writes,0)
+ COALESCE(er.reads,0)
+ COALESCE(er.writes,0) AS physical_io
,COALESCE(er.open_transaction_count,-1) AS open_tran
,COALESCE(es.program_name,'') AS program_name
,es.login_time
FROM sys.dm_exec_sessions es
INNER JOIN sys.dm_exec_requests ec2 ON es.session_id = ec2.blocking_session_id
LEFT OUTER JOIN sys.dm_exec_connections ec ON es.session_id = ec.session_id
LEFT OUTER JOIN sys.dm_exec_requests er ON es.session_id = er.session_id
LEFT OUTER JOIN sys.server_principals sp ON es.security_id = sp.sid
CROSS APPLY sys.dm_exec_sql_text(ec.most_recent_sql_handle) AS st
where es.is_user_process = 1
and es.session_id <> @@spid
Run Code Online (Sandbox Code Playgroud)
问题是,除了 sys.sysprocesses 之外,是否还有任何 DMV 可以用来获取此信息?
这是我用来监视导致阻塞问题的休眠 SPID 的方法:
SELECT
s.session_id
,s.status
,s.login_time
,s.host_name
,s.program_name
,s.host_process_id
,s.original_login_name
,s.last_request_end_time
,CAST(t.text AS nvarchar(4000)) AS [text]
FROM sys.dm_exec_sessions AS s
INNER JOIN sys.dm_exec_connections AS c
ON s.session_id = c.session_id
CROSS APPLY (
SELECT MAX(DB_NAME(dt.database_id)) AS database_name
FROM sys.dm_tran_session_transactions AS st
INNER JOIN sys.dm_tran_database_transactions AS dt
ON st.transaction_id = dt.transaction_id
WHERE is_user_transaction = 1
GROUP BY st.session_id
HAVING s.session_id = st.session_id
) AS trans
CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle) AS t
WHERE s.session_id NOT IN (
SELECT session_id
FROM sys.dm_exec_requests
)
AND s.session_id IN (
SELECT request_session_id
FROM sys.dm_tran_locks
WHERE request_status = 'GRANT'
)
AND STATUS = 'sleeping'
AND is_user_process = 1;
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
为了具体回答您的问题,sys.dm_tran_database_transactions
保存您正在查找的信息。