如何检查SQL Server 2005中是否存在尚未提交的事务?

时间:2009-06-11 09:22:40

标签: sql sql-server sql-server-2005 transactions

是否有人知道检查SQL Server 2005中是否存在未提交事务的命令?

6 个答案:

答案 0 :(得分:39)

在sql 2005,2008中使用@@trancountsys.dm_tran_active_transactions DMV

答案 1 :(得分:24)

XACT_STATE()报告会话的事务状态,指示会话是否具有活动事务,以及事务是否能够提交。它返回三个值:

  • 1,会话有一个活动的事务。会话可以执行任何操作,包括写入数据和提交事务。
  • 0,会话没有活动的事务。
  • -1,会话具有活动事务,但是发生了导致事务被归类为不可提交事务的错误。会话无法提交事务或回滚到保存点;它只能请求完全回滚事务。在回滚事务之前,会话无法执行任何写入操作。会话只能在回滚事务之前执行读取操作。事务回滚后,会话可以执行读取和写入操作,并可以开始新事务。

@@ TRANCOUNT 返回当前连接的活动事务数。

  • 0,不在交易中
  • 1,在交易中
  • n,在嵌套事务中

答案 2 :(得分:7)

运行

DBCC OPENTRAN

答案 3 :(得分:5)

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

- 仅当SELECT @@ TRANCOUNT命令execute.otherwise NULL

时才会获得DB名称

执行上面的代码...将给出事务发生的会话详细信息..

答案 4 :(得分:2)

总而言之,有几种方法:

  1. SELECT @@ trancount
  2. DBCC OPENTRAN
  3. SELECT XACT_STATE()
  4. sp_lock的
  5. SELECT * FROM sys.dm_tran_active_transactions

答案 5 :(得分:0)

sp_who2 sp_lock的