Answers:
任何活动的未清事务将固定日志,防止被截断并最终导致增长。如果开始事务,请写入日志,然后永远等待,以希望消息最终会唤醒您,您只是固定了日志并导致其增长。
最近,我开始建议人们在激活的过程中回避WAITFOR以及循环。只需发出RECIEVe并完成,就让激活机制为您循环(确实如此),而不必等待,只是简单的RECEIVE。
WAITFOR的RECEIVE风格在内部创建了一个保存点。这将生成日志(至少3条日志记录),并且确实在等待时将日志固定在适当的位置。WAITFOR超时时间过长(或更糟糕的是,无限长)将是非常糟糕的做法。
WAITFOR (RECEIVE...
“您可以扩展吗?也许,我误会了。
begin transaction; waitfor(receive...)
在等待时不会生成任何日志记录(不会“激活”交易),因此不会固定日志。仅begin transaction;[insert|update|delete];waitfor(receive...)
将导致事务“激活”(生成日志记录),因此实际上将在等待时固定日志。
在SQL Server 2008 R2上,如果我执行WAITFOR(RECEIVE),然后运行DBCC OPENTRAN,即使没有任何先前更新,它也会将事务显示为活动状态。
WAITFOR (...) TIMEOUT 3600000
解决问题吗?例如每小时发布一次。