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


Answers:


5

不,SQL Server不保留任何有关中止/回滚的事务的历史记录,这些历史记录很容易到达,并且不会引入其他潜在问题(如@ooutwire的答案所述)。甚至是已提交的事务。

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

跟踪:

在此处输入图片说明

扩展事件:

在此处输入图片说明


当然可以,它们位于日志文件和日志备份文件中。
ooutwire 2013年

1
@ooutwire,您如何轻松找到这些人?如果他们不再在日志中,您将如何获得他们?这些日志记录充其量只是暂时的。
亚伦·伯特兰

看我的答案。最好的方法是创建频繁的日志备份。我同意这样的解决方案不是理想的。但我认为没有理由一直在产品中搜索中止的交易。如果那是愿望,那么跟踪或XEvent似乎是明智的解决方案。
ooutwire 2013年

2
我当然看到了你的答案。我说的很轻松,也应该可靠地说。:-)
亚伦·伯特兰

6
我和@AaronBertrand在一起。麻烦的是梳理事务日志(注意:它们不是本来的目的),您最好为该故障排除创建一个轻量级的XE会话。
Thomas Stringer 2013年

4

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

如果要查看实例上的当前事务,可以使用sys.dm_tran_active_transactionsDMV。

此外,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事务开始,完成,回滚或执行保存点时发生。对应用程序,触发器或存储过程进行故障排除时,使用此事件来监视事务行为。


4

您可以使用fn_dblog()来查找中止的事务的事务ID以及许多其他有用的信息。

选择 * 
FROM fn_dblog(NULL,NULL)
WHERE Operation ='LOP_ABORT_XACT';
走

它扫描日志的活动部分中的所有事务日志。可以使用跟踪标志2537覆盖该标志,该标志将使您尽可能返回最旧的“未重用” VLF的开始。使用此功能时要小心,因为它会随机扫描日志,并且在进行扫描时不会更改日志;因此,您可能会看到日志增长。

您还可以对日志备份文件使用fn_dump_dblog。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.