SQL Server ROLLBACK事务花了很长时间。为什么?

问题描述 投票:1回答:2

我们有一个巨大的DML脚本,它打开一个事务并执行很多更改,然后才提交。

所以最近,我已经触发了这个脚本(通过一个应用程序),并且由于花费了相当长的时间,我已经杀死了会话,这触发了ROLLBACK。

所以问题是这个ROLLBACK花了很长时间,而且它占用了大量的CPU(100%利用率),而且当我监视这个会话时(使用exec DMV),我看到了很多与IO相关的等待(IO_COMPLETION, PAGE_IO_LATCH等)。

所以我的问题是:1。回滚需要花费大量时间吗?是因为它需要将每个恢复更改写入LOG文件吗? IO等待我看到可能与此LOG文件的IO操作有关? 2.我是否可以找到任何在线资源,这解释了ROLLBACK机制的工作原理?

谢谢

sql-server tsql transactionscope
2个回答
1
投票

基于另一篇关于DB的DBA方面的文章,ROLLBACKs由于至少两个原因而变慢:原始SQL能够是多线程的,其中回滚是单线程的,而两个,一个提交确认已经完成的工作,其中回滚不仅必须标识要反转的日志操作,还要定位受影响的行。

https://dba.stackexchange.com/questions/5233/is-rollback-a-fast-operation


1
投票

这就是我发现的为什么SQL Server中的ROLLBACK操作可能很耗时以及它为什么会产生大量IO的原因。

背景知识(Open Tran / Log机制):当对DB进行大量更改作为打开事务的一部分时,这些更改会修改内存中的数据页(脏页)和日志记录(称为LOG BLOCKS的结构) )生成的最初写入缓冲池(In Memory)。通过重复检查点操作或延迟写入过程将这些脏页刷新到磁盘。根据SQL Server的预写日志记录机制,在刷新脏页之前,还需要将描述这些更改的LOG RECORDS刷新到磁盘。

记住这些背景知识,现在当事务被回滚时,这几乎就像一个恢复操作,其中所有写入磁盘的更改都必须撤消。因此,我们遇到的大量IO可能因此而发生,因为有大量数据需要撤消。

信息来源:https://app.pluralsight.com/library/courses/sqlserver-logging/table-of-contents本课程对SQL Server中日志记录恢复的工作原理进行了非常详尽的解释。

© www.soinside.com 2019 - 2024. All rights reserved.