触发无限期的 WAITFOR 会增加日志文件的大小吗?

Ang*_*ker 17 sql-server-2005 sql-server service-broker

在我的应用程序的最后一个版本中,我添加了一个命令,告诉它在 Service Broker 队列中有东西到达时等待:

WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
Run Code Online (Sandbox Code Playgroud)

DBA 告诉我,自从添加以来,日志大小已经飙升。这可能是正确的吗?还是我应该去别处寻找?

Rem*_*anu 18

任何活动的打开事务都会固定日志,防止截断并最终导致增长。如果你开始一个事务,写入日志然后永远等待消息最终会唤醒你,你只是固定日志并使其增长。

最近,我开始建议人们在激活过程中避开 WAITFOR 以及循环。只需发出RECEVe并完成,让激活机制为您循环(它确实如此)并且不要等待,只是简单的RECEIVE。

RECEIVE 的 WAITFOR 风格在内部创建了一个保存点。这会生成日志(至少 3 个日志记录)并且确实在等待时将日志固定到位。有一个很长的 WAITFOR 超时(或更糟糕的是,无限的)将是一个非常糟糕的做法。

  • `开始交易;waitfor(receive...)` 在等待时不会生成任何日志记录(不会“激活”事务),因此不会固定日志。只有 `begin transaction;[insert|update|delete];waitfor(receive...)` 会导致事务“激活”(生成日志记录),因此在等待时实际上会固定日志。 (8认同)
  • 您的日志将在一小时内增长*很多*。WAITFOR (REC EIVE) 是指像 5 秒这样的间隔...... (2认同)

小智 5

在 SQL Server 2008 R2 上,如果我执行 WAITFOR(RECEIVE),然后运行 ​​DBCC OPENTRAN,它会将事务显示为活动的,即使没有任何先前的更新也是如此。

  • 正确,WAITFOR 在内部创建一个保存点,这会触发日志写入,因此它确实将日志固定到位。 (2认同)