我有一个非常繁忙的数据库,我被要求寻找回滚的事务。
我使用 SQL Server Profiler 来监视TM: Rollback
Tran 完成事件,这表明每分钟都会发生数十个这样的事件,但它没有给我任何关于正在回滚的事务、回滚影响的对象的任何指示,或者回滚发生的原因。简而言之,它的用途似乎非常有限。
例如,如果我还尝试监视,以便SQL:StmtStarting
为回滚提供一些上下文,那么在这个繁忙的环境中就会有太多噪音,无法识别哪个语句负责回滚。
我也尝试运行语句
SELECT *
FROM fn_dblog (NULL, NULL)
WHERE Operation = 'LOP_ABORT_XACT';
但这并没有返回任何结果(考虑到 SQL Profiler 报告的回滚次数,这似乎很奇怪)。
有什么方法可以生成显示已回滚事务的报告?
蒂亚!
这是执行此操作的预扩展事件方法。
不要以交互方式使用 Profiler,而是使用它来生成写入文件的服务器端 SQL 跟踪。运行跟踪一段时间后,您可以查询跟踪文件和/或将跟踪文件加载到表中并查询这些文件。查找具有回滚的会话,然后按顺序查询该会话的所有事件。
我会在这里尝试一些可能不是更好的方法,并且可能会对您的服务器产生性能影响,但我想这总比没有好。在 sys.dm_exec_requests dmv 中,您拥有查询的状态。当它回滚时,它显示“回滚”。如果您创建一个作业,不断查看该 DVM 并收集具有该状态的任何请求的 SQL_handle(以及更多信息,如果需要),这可能是一个很好的起点。