Script to show all opened transactions:
1
2SELECT d.name as DatabaseName
3, ses.host_name as [host_name]
4, ses.login_time AS session_login_time
5, ses.last_request_start_time
6, ses.last_request_end_time
7, ses.login_name
8, ses.nt_user_name
9, ses.STATUS
10, tst.session_id as SPID
11, tst.enlist_count AS nr_active_reqs_in_session
12, tst.is_user_transaction
13, CASE tst.is_user_transaction WHEN 1 THEN 'Transaction initiated by user request'
14 WHEN 0 THEN 'System transaction' END AS tran_status
15, tst.is_local
16, CASE tst.is_local WHEN 1 THEN 'Local transaction'
17 WHEN 0 THEN 'Distributed transaction' END AS is_local_description
18, tat.NAME
19, tat.transaction_begin_time
20, DATEDIFF(SECOND, tat.transaction_begin_time, GETDATE()) AS Duration
21, CASE tat.transaction_type WHEN 1 THEN 'Read/write transaction'
22 WHEN 2 THEN 'Read-only transaction'
23 WHEN 3 THEN 'System transaction'
24 WHEN 4 THEN 'Distributed transaction' END AS tran_type_description
25, tat.transaction_state
26, CASE tat.transaction_state WHEN 0 THEN 'The transaction has not been completely initialized yet'
27 WHEN 1 THEN 'The transaction has been initialized but has not started'
28 WHEN 2 THEN 'The transaction is active'
29 WHEN 3 THEN 'The transaction has ended. This is used for read-only transactions'
30 WHEN 4 THEN 'The commit process has been initiated on the distributed transaction'
31 WHEN 5 THEN 'The transaction is in a prepared state and waiting resolution'
32 WHEN 6 THEN 'The transaction has been committed'
33 WHEN 7 THEN 'The transaction is being rolled back'
34 WHEN 8 THEN 'The transaction has been rolled back' END AS transaction_state_description
35, tat.dtc_state
36, CASE tat.dtc_state WHEN 1 THEN 'ACTIVE'
37 WHEN 2 THEN 'PREPARED'
38 WHEN 3 THEN 'COMMITTED'
39 WHEN 4 THEN 'ABORTED'
40 WHEN 5 THEN 'RECOVERED' END AS dtc_state_description
41, tst.is_enlisted
42, tst.is_bound AS bound_status
43, CASE tst.is_bound WHEN 1 THEN 'active via bound sessions'
44 WHEN 0 THEN 'not active via bound sessions' END AS bound_status_description
45, est.[text] [StatementText]
46, 'BEGIN TRY kill '+CAST(tst.session_id AS VARCHAR(5))+'; END TRY BEGIN CATCH END CATCH;' as SqlScriptToKillTransaction
47FROM sys.dm_exec_sessions AS ses
48INNER JOIN sys.dm_tran_session_transactions AS tst ON ses.session_id = tst.session_id
49INNER JOIN sys.dm_tran_active_transactions AS tat ON tst.transaction_id = tat.transaction_id
50INNER JOIN sys.dm_tran_database_transactions AS tdt ON tat.transaction_id = tdt.transaction_id
51INNER JOIN sys.databases AS d ON tdt.database_id = d.database_id
52LEFT OUTER JOIN sys.dm_exec_requests AS er ON ses.[session_id] = er.[session_id]
53LEFT OUTER JOIN sys.dm_exec_connections AS ec ON ec.[session_id] = ses.[session_id]
54OUTER APPLY sys.dm_exec_sql_text(ec.[most_recent_sql_handle]) AS est
55WHERE d.database_id > 4
Ce script ferme les transactions que la durée dépasse à 60 minutes.
1
2DECLARE @sql VARCHAR(MAX);
3SET @sql = '';
4SELECT @sql = @sql + 'BEGIN TRY kill '+CAST(tst.session_id AS VARCHAR(5))+'; END TRY BEGIN CATCH END CATCH;'
5FROM sys.dm_exec_sessions AS ses
6INNER JOIN sys.dm_tran_session_transactions AS tst ON ses.session_id = tst.session_id
7INNER JOIN sys.dm_tran_active_transactions AS tat ON tst.transaction_id = tat.transaction_id
8INNER JOIN sys.dm_tran_database_transactions AS tdt ON tat.transaction_id = tdt.transaction_id
9INNER JOIN sys.databases ON tdt.database_id = sys.databases.database_id
10WHERE sys.databases.database_id > 4 and DATEDIFF(SECOND, tat.transaction_begin_time, GETDATE()) > 3600
11PRINT @sql;
12EXEC(@sql);
Source: https://www.experts-exchange.com/questions/26868182/how-to-check-transaction-id-belongs-to-which-spid.html https://msdn.microsoft.com/en-us/library/ms182792.aspx
Comments