【问题标题】:How to check active transactions in SQL Server 2014?如何检查 SQL Server 2014 中的活动事务?
【发布时间】:2015-11-04 15:50:43
【问题描述】:

我正在使用 SQL Server 2014 并且想知道如何检查我的活动事务?

【问题讨论】:

    标签: sql sql-server-2014


    【解决方案1】:
    1. 使用sys.sysprocesses查询

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

    3. sys.dm_tran_active_transactions

    返回有关 SQL Server 实例的事务的信息。 Syntax

    想知道交易吗?

    事务是单个工作单元。如果交易是 成功,事务期间所做的所有数据修改 已提交并成为数据库的永久部分。

    Find more at docs

    【讨论】:

      【解决方案2】:

      如果您想了解有关活动会话的更多详细信息,例如 会话 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
      

      你会得到类似的结果

      【讨论】:

      • sys.dm_tran_active_transactions 不在 sys.dm_tran_session_transactions 中吗?
      【解决方案3】:

      翻译 3. Tharif cmets 的查询。

      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
      

      【讨论】:

        【解决方案4】:

        或使用 DBCC 命令

        DBCC OPENTRAN
        

        【讨论】:

          【解决方案5】:

          最有用的方法是;

          DBCC opentran()
          

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

          最旧的活动交易: SPID(服务器进程 ID):190 UID(用户 ID):-1 名称:implicit_transaction LSN : (500549:37333:1) 开始时间:2021年12月4日上午10:36:21:673

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

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

          exec sp_who2 190
          exec sp_lock 190
          
          
          KILL 190
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-03-02
            • 1970-01-01
            • 1970-01-01
            • 2013-07-25
            • 1970-01-01
            • 2019-06-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多