Każda aktywna otwarta transakcja przypina dziennik, zapobiegając obcięciu i ostatecznie powodując wzrost. Jeśli rozpoczniesz transakcję, napisz do dziennika, a następnie poczekaj wiecznie, mając nadzieję, że wiadomość w końcu cię obudzi, po prostu przypięłaś dziennik i spowoduje jego wzrost.
Ostatnio zacząłem polecać ludziom unikanie WAITFOR w aktywowanej procedurze wraz z pętlą. Po prostu wydaj ODBIÓR i gotowe, pozwól mechanizmowi aktywacji zapętlić się (zrobi to) i nie czekaj, po prostu ODBIERZ.
Smak ODBIORU WAITFOR tworzy wewnętrznie punkt zapisu. Generuje to dziennik (co najmniej 3 rekordy dziennika) i rzeczywiście przypina dziennik w miejscu podczas oczekiwania. Długa przerwa WAITFOR (lub, co gorsza, nieskończona) byłaby bardzo złą praktyką.
By WAITFOR (...) TIMEOUT 3600000rozwiązać problem? Np. Zwolnij co godzinę.
AngryHacker,
2
Twój dziennik wzrośnie dużo w ciągu jednej godziny. WAITFOR (REC EIVE) jest przeznaczony na interwały takie jak 5 sekund ...
Remus Rusanu,
1
Powinieneś także sprawdzić, dlaczego Twoja transakcja jest faktycznie aktywna (zapisał dziennik). Typowy wzorzec Service Broker nie wydaje żadnych zapisów przed ODBIERANIEM.
Remus Rusanu,
1
Nie rozumiem twojego ostatniego komentarza. Transakcja jest aktywna, ponieważ wydałem WAITFOR (RECEIVE...Czy możesz ją rozwinąć? Być może źle zrozumiałem.
AngryHacker,
8
begin transaction; waitfor(receive...)nie wygeneruje żadnych zapisów dziennika (nie „aktywuje” transakcji) podczas oczekiwania, a zatem nie przypina dziennika. Tylko begin transaction;[insert|update|delete];waitfor(receive...)spowoduje, że transakcja „aktywuje się” (generuje rekordy dziennika), a tym samym faktycznie przypina dziennik podczas oczekiwania.
Remus Rusanu,
5
Na SQL Server 2008 R2, jeśli wykonam WAITFOR (ODBIERZ), a następnie uruchomię DBCC OPENTRAN, pokazuje transakcję jako aktywną, nawet przy braku wcześniejszych aktualizacji.
WAITFOR (...) TIMEOUT 3600000
rozwiązać problem? Np. Zwolnij co godzinę.WAITFOR (RECEIVE...
Czy możesz ją rozwinąć? Być może źle zrozumiałem.begin transaction; waitfor(receive...)
nie wygeneruje żadnych zapisów dziennika (nie „aktywuje” transakcji) podczas oczekiwania, a zatem nie przypina dziennika. Tylkobegin transaction;[insert|update|delete];waitfor(receive...)
spowoduje, że transakcja „aktywuje się” (generuje rekordy dziennika), a tym samym faktycznie przypina dziennik podczas oczekiwania.Na SQL Server 2008 R2, jeśli wykonam WAITFOR (ODBIERZ), a następnie uruchomię DBCC OPENTRAN, pokazuje transakcję jako aktywną, nawet przy braku wcześniejszych aktualizacji.
źródło