Answers:
不,SQL Server不保留任何有关中止/回滚的事务的历史记录,这些历史记录很容易到达,并且不会引入其他潜在问题(如@ooutwire的答案所述)。甚至是已提交的事务。
您将必须在错误处理中执行自己的日志记录,或者使用服务器端跟踪或扩展事件捕获与事务相关的特定事件。
跟踪:
扩展事件:
当您说“失败的”交易时,您到底是什么意思?
如果要查看实例上的当前事务,可以使用sys.dm_tran_active_transactions
DMV。
此外,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;
也可以从sys.dm_tran_session_transactions
以下信息中获取此信息:
select
session_id,
is_user_transaction,
open_transaction_count
from sys.dm_tran_session_transactions;
如果您想捕获事务回滚的时间(假设您对“失败”事务的渴望如此之高),则可以捕获扩展rollback_tran_completed
事件。如果您正在寻找事务的“所有”视图,则可以捕获该sql_transaction
事件,该事件由SQL Server定义为
在SQL Server事务开始,完成,回滚或执行保存点时发生。对应用程序,触发器或存储过程进行故障排除时,使用此事件来监视事务行为。