Чи збільшує розмір файлу журналу звільнення на невизначений термін WAITFOR?


16

В останньому випуску свого додатка я додав команду, яка повідомляє йому почекати, коли щось чекає в черзі Service Broker:

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

DBA мені кажуть, що з моменту додавання розміри колод пройшли через дах. Чи може це бути правильно? Або я повинен шукати в іншому місці?

Відповіді:


17

Будь-яка активна відкрита транзакція зафіксує журнал, запобігаючи усіченню та врешті-решт спричиняючи зростання. Якщо ви розпочали транзакцію, запишіть у журнал, а потім назавжди чекайте, сподіваючись, що повідомлення зрештою розбудить вас, ви просто закріпили журнал і змусите його рости.

Нещодавно я почав рекомендувати людям уникати WAITFOR в активованій процедурі разом з циклом. Просто випустіть RECIEVe і будьте готові, нехай цикл механізму активації буде циклічним для вас (він це робить), і не WAITFOR, просто просто ПОЛУЧАЙТЕ.

Аромат WAITFOR RECEIVE створює внутрішньо збережену точку. Це генерує журнал (принаймні 3 записи журналу) і дійсно закріплює журнал на місці очікування. Тривалий час очікування WAITFOR (або ще гірше, нескінченний) було б дуже поганою практикою.


1
Буде чи WAITFOR (...) TIMEOUT 3600000вирішити цю проблему? Наприклад, випускають щогодини.
AngryHacker

2
Ваш журнал зросте сильно за одну годину. WAITFOR (REC EIVE) призначений для інтервалів, таких як 5 секунд ...
Рем Русану

1
Ви також повинні дослідити, чому ваша транзакція насправді активна (має письмовий журнал). Типовий шаблон сервісного брокера не видає жодного запису перед ПОЛУЧЕНОЮ.
Рем Русану

1
Я не розумію вашого останнього коментаря. Транзакція активна , тому що я випустив WAITFOR (RECEIVE...Могли б ви розширити? Можливо, я неправильно зрозумів.
AngryHacker

8
begin transaction; waitfor(receive...)не буде генерувати жодних записів журналу (не буде "активувати" транзакцію під час очікування, і, таким чином, не зафіксує журнал. Тільки begin transaction;[insert|update|delete];waitfor(receive...)це призведе до активації транзакції (генерування записів журналу) і, таким чином, фактично зафіксує журнал під час очікування.
Рем Русану

5

На SQL Server 2008 R2, якщо я виконую WAITFOR (RECEIVE), а потім запускаю DBCC OPENTRAN, він показує транзакцію як активну, навіть за відсутності будь-яких попередніх оновлень.


2
Правильно, WAITFOR створює точку збереження внутрішньо, і це запускає запис журналу, щоб він закріплював журнал на місці.
Ремус Русану


@binki цей коментар стосується SQL Server 2005. Це для R2 2008 року. Вони поводяться по-різному щодо цього питання, якщо я правильно пам’ятаю.
Рем Русану
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.