有谁知道SQL Server 2005中检查是否有未提交事务的命令吗?
在sql 2005、2008中使用@@trancount或sys.dm_tran_active_transactionsDMV
XACT_STATE()报告会话的事务状态,指示会话是否有活动事务,以及事务是否能够提交。它返回三个值:
@@TRANCOUNT 返回当前连接的活动事务数。
奔跑
DBCC OPENTRAN
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 命令时才会获取数据库名称。否则为 NULL
执行上面的代码...将给出交易发生的会话详细信息..
总结起来有以下几种方法:
sp_who2 sp_lock
对于您会话中的交易
XACT_STATE()
SELECT @@trancount
DBCC OPENTRAN
对于来自另一个会话或程序的事务的问题
SELECT * FROM sys.sysprocesses WHERE open_tran = 1
显示其他会话事务以及 spid,以便您可以终止它
SELECT * FROM sys.dm_tran_active_transactions
显示用户和系统事务,但有用的输出较少
sp_lock
显示所有被锁定的内容,而不仅仅是交易 - 与
SELECT * FROM sys.sysprocesses WHERE open_tran = 1 它告诉您要调查或终止哪个进程。
因此,如果您通过简单的会话检查来查看当前事务状态,那么
XACT_STATE()
选择@@trancount
DBCC OPENTRAN
对于正确的事务问题,当您试图找出阻止事物/访问表等的原因时,然后 sp_who2 和
SELECT * FROM sys.sysprocesses WHERE open_tran = 1