在我的应用程序的最后一个版本中,我添加了一个命令,告诉它在有内容到达 Service Broker 队列时等待:
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
DBA 告诉我,自添加以来,日志大小已经达到顶峰。这是正确的吗?还是我应该去别处看看?
在我的应用程序的最后一个版本中,我添加了一个命令,告诉它在有内容到达 Service Broker 队列时等待:
WAITFOR (RECEIVE CONVERT(int, message_body) AS Message FROM MyQueue)
DBA 告诉我,自添加以来,日志大小已经达到顶峰。这是正确的吗?还是我应该去别处看看?
任何活动的开放事务都会固定日志,防止截断并最终导致增长。如果你开始一个事务,写入日志然后永远等待一条消息最终会唤醒你,你只是固定了日志并导致它增长。
最近我开始建议人们在激活过程中避开 WAITFOR 以及循环。只需发出一个 RECIEVe 并完成,让激活机制为你循环(它确实如此)并且不要等待,只是简单的 RECEIVE。
RECEIVE 的 WAITFOR 风格在内部创建一个保存点。这会生成日志(至少 3 条日志记录)并且确实会在等待时将日志固定到位。设置较长的 WAITFOR 超时(或更糟,无限超时)将是一种非常糟糕的做法。
在 SQL Server 2008 R2 上,如果我执行 WAITFOR(RECEIVE),然后运行 DBCC OPENTRAN,它会显示事务处于活动状态,即使之前没有任何更新。