获取失败或从未提交的事务

Jef*_*eff 10 sql-server transaction sql-server-2012

有什么地方可以查找 SQL Server 2012 中的失败事务吗?

Aar*_*and 5

不,SQL Server 不会维护任何关于中止/回滚的事务的历史记录,这些历史记录很简单,也不会引入其他潜在问题(如@ooutwire 的回答中所述)。甚至已经提交的事务。

您必须在错误处理中执行自己的日志记录,或者使用服务器端跟踪或扩展事件捕获特定的事务相关事件。

痕迹:

在此处输入图片说明

扩展事件:

在此处输入图片说明

  • 我和@AaronBertrand 在一起。由于梳理事务日志会遇到麻烦(**注意:不是它们的用途**),您不妨为此故障排除创建一个轻量级 XE 会话。 (6认同)
  • 我当然看到了你的回答。我说*轻松*,也应该说*可靠*。:-) (2认同)

Tho*_*ger 4

当您说“失败”交易时,您到底是什么意思?

如果您想查看实例上的当前事务,可以使用 DMV sys.dm_tran_active_transactions

此外,sys.dm_exec_sessions还有open_transaction_count可以按会话为您提供此信息的工具。下面是一个诊断查询,用于提取所有具有开放事务的用户进程:

select 
    s.session_id,
    s.login_name,
    s.open_transaction_count,
    st.text as most_recent_sql_text
from sys.dm_exec_sessions s
inner join sys.dm_exec_connections c
on s.session_id = c.session_id
outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) st
where s.is_user_process = 1
and s.open_transaction_count > 0;
Run Code Online (Sandbox Code Playgroud)

此信息也可以从以下位置获取sys.dm_tran_session_transactions

select
    session_id,
    is_user_transaction,
    open_transaction_count
from sys.dm_tran_session_transactions;
Run Code Online (Sandbox Code Playgroud)

如果您想捕获事务回滚的时间(假设您希望“失败”事务),您可以捕获扩展事件事件rollback_tran_completed。如果您正在寻找事务的“一切”视图,您可以捕获事件sql_transaction,SQL Server 定义的事件是

当 SQL Server 事务开始、完成、回滚或执行保存点时发生。在对应用程序、触发器或存储过程进行故障排除时,使用此事件来监视事务行为。