如何查看 SQL Server 2014 中的活动交易?

How to check active transactions in SQL Server 2014?

我正在使用 SQL Server 2014,想知道如何查看我的活动交易?

  1. 查询 sys.sysprocesses

    SELECT * FROM sys.sysprocesses WHERE open_tran = 1
    
  2. DBCC OPENTRAN :有助于识别可能阻止日志截断的活动事务。 DBCC OPENTRAN 显示有关指定数据库的事务日志中最旧的活动事务以及最旧的分布式和非分布式复制事务(如果有)的信息。仅当日志中存在活动事务或数据库包含复制信息时才会显示结果。如果日志中没有活动事务,则会显示一条信息性消息。

  3. sys.dm_tran_active_transactions

Returns 有关 SQL 服务器实例事务的信息。 Syntax

想知道交易吗?

A transaction is a single unit of work. If a transaction is successful, all of the data modifications made during the transaction are committed and become a permanent part of the database.

Find more at docs

或使用 DBCC 命令

DBCC OPENTRAN

翻译Tharif评论的3.查询。

select transaction_id, name, transaction_begin_time
 ,case transaction_type 
    when 1 then '1 = Read/write transaction'
    when 2 then '2 = Read-only transaction'
    when 3 then '3 = System transaction'
    when 4 then '4 = Distributed transaction'
end as transaction_type 
,case transaction_state 
    when 0 then '0 = The transaction has not been completely initialized yet'
    when 1 then '1 = The transaction has been initialized but has not started'
    when 2 then '2 = The transaction is active'
    when 3 then '3 = The transaction has ended. This is used for read-only transactions'
    when 4 then '4 = The commit process has been initiated on the distributed transaction'
    when 5 then '5 = The transaction is in a prepared state and waiting resolution'
    when 6 then '6 = The transaction has been committed'
    when 7 then '7 = The transaction is being rolled back'
    when 8 then '8 = The transaction has been rolled back'
end as transaction_state
,case dtc_state 
    when 1 then '1 = ACTIVE'
    when 2 then '2 = PREPARED'
    when 3 then '3 = COMMITTED'
    when 4 then '4 = ABORTED'
    when 5 then '5 = RECOVERED'
end as dtc_state 
,transaction_status, transaction_status2,dtc_status, dtc_isolation_level, filestream_transaction_id
from sys.dm_tran_active_transactions

如果您想了解有关活动会话的更多详细信息,例如 会话 ID、主机名、登录名、事务 ID、事务名称、事务开始时间、数据库 ID、数据库名称,您可以在下面使用 sql 查询

SELECT
trans.session_id AS [SESSION ID],
ESes.host_name AS [HOST NAME],login_name AS [Login NAME],
trans.transaction_id AS [TRANSACTION ID],
tas.name AS [TRANSACTION NAME],tas.transaction_begin_time AS [TRANSACTION 
BEGIN TIME],
tds.database_id AS [DATABASE ID],DBs.name AS [DATABASE NAME]
FROM sys.dm_tran_active_transactions tas
JOIN sys.dm_tran_session_transactions trans
ON (trans.transaction_id=tas.transaction_id)
LEFT OUTER JOIN sys.dm_tran_database_transactions tds
ON (tas.transaction_id = tds.transaction_id )
LEFT OUTER JOIN sys.databases AS DBs
ON tds.database_id = DBs.database_id
LEFT OUTER JOIN sys.dm_exec_sessions AS ESes
ON trans.session_id = ESes.session_id
WHERE ESes.session_id IS NOT NULL

你会得到类似的结果

最有用的方法是;

DBCC opentran()

当您检查时,您将收到以下消息;

Oldest active transaction: SPID (server process ID): 190 UID (user ID) : -1 Name : implicit_transaction LSN : (500549:37333:1) Start time : Dec 4 2021 10:36:21:673AM

并且如果您 运行 DBCC opentran 多次并且您总是获得相同的服务器进程 ID 然后系统然后事务卡在数据库中。

因此,有必要先用下面的代码查看SPID的详细信息,然后杀死那个SPID进程。

exec sp_who2 190
exec sp_lock 190


KILL 190