触发不确定的WAITFOR是否会增加日志文件的大小?


16

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

WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)

DBA告诉我,自添加以来,日志大小已经达到顶峰。这是正确的吗?还是我应该在别处寻找?

Answers:


17

任何活动的未清事务将固定日志,防止被截断并最终导致增长。如果开始事务,请写入日志,然后永远等待,以希望消息最终会唤醒您,您只是固定了日志并导致其增长。

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

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


1
WAITFOR (...) TIMEOUT 3600000解决问题吗?例如每小时发布一次。
AngryHacker 2012年

2
您的日志将在一小时内增长很多。WAITFOR(REC EIVE)的间隔时间约为5秒...
Remus

1
您还应该调查为什么您的事务实际上处于活动状态(已写入日志)。典型的Service Broker模式不会在RECEIVE之前发出任何写操作。
Remus Rusanu

1
我不明白您的最后评论。该交易正在进行,因为我发出了WAITFOR (RECEIVE...“您可以扩展吗?也许,我误会了。
AngryHacker 2012年

8
begin transaction; waitfor(receive...)在等待时不会生成任何日志记录(不会“激活”交易),因此不会固定日志。仅begin transaction;[insert|update|delete];waitfor(receive...)将导致事务“激活”(生成日志记录),因此实际上将在等待时固定日志。
Remus Rusanu

5

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


2
正确,WAITFOR在内部创建一个保存点,这会触发日志写入,因此它将日志固定在适当的位置。
雷木斯·鲁萨努

@RemusRusanu不会与您先前对其他答案的评论相矛盾吗?
宾基

@binki表示SQL Server2005。这是针对2008 R2的。如果我没记错的话,他们在这个问题上的表现会有所不同。
Remus Rusanu
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.