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

43

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

6个回答

48

33

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

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

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

  • 0,未处于事务中
  • 1,处于事务中
  • n,处于嵌套事务中

1
非常好的解释,正如你所说,“会话无法提交事务或回滚到保存点;它只能请求完全回滚事务。”那么什么是完全回滚呢? - Khurram Ali
1
@KhurramAli,“-1”表示您不能使用“commit”或“rollback YourSavePoint”,但必须使用“rollback”,它基本上将@@transcount设置为零,回滚每个嵌套事务。 - KM.

10

运行

DBCC OPENTRAN

7
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命令时,才会获取DB名称。否则为NULL

执行上述代码...将提供事务发生的会话详细信息。


6

总之,有以下几种方法:

  1. SELECT @@trancount(查询当前事务嵌套层数)
  2. DBCC OPENTRAN(查看最老的未提交事务)
  3. SELECT XACT_STATE() (返回当前事务状态)
  4. sp_lock(查看锁信息)
  5. SELECT * FROM sys.dm_tran_active_transactions (查看活动事务)

0

sp_who2 sp_lock


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接