Việc bắn ra một WAITFOR không xác định có làm tăng kích thước tệp nhật ký không?


16

Trong bản phát hành cuối cùng của ứng dụng của mình, tôi đã thêm một lệnh bảo nó chờ khi có thứ gì đó đến trong hàng đợi Nhà môi giới dịch vụ:

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

Các DBA nói với tôi rằng kể từ khi bổ sung, kích thước nhật ký đã đi qua mái nhà. Điều này có thể đúng không? Hay tôi nên tìm nơi khác?

Câu trả lời:


17

Bất kỳ giao dịch mở hoạt động nào sẽ ghim nhật ký, ngăn chặn cắt ngắn và cuối cùng gây ra sự tăng trưởng. Nếu bạn bắt đầu một giao dịch, hãy viết vào nhật ký và sau đó chờ đợi mãi mãi với hy vọng một thông điệp cuối cùng sẽ đánh thức bạn, bạn chỉ cần ghim nhật ký và khiến nó phát triển.

Gần đây tôi bắt đầu khuyên mọi người nên tránh xa WAITFOR trong quy trình kích hoạt, cùng với vòng lặp. Chỉ cần đưa ra một RECIEVe và được thực hiện, hãy để vòng lặp cơ chế kích hoạt cho bạn (nó) và không WAITFOR, chỉ đơn giản là NHẬN.

Hương vị WAITFOR của RECEIVE tạo ra một điểm lưu trữ bên trong. Điều này tạo ra nhật ký (ít nhất 3 bản ghi nhật ký) và thực sự ghim nhật ký vào vị trí trong khi chờ đợi. Có một thời gian chờ WAITFOR dài (hoặc tệ hơn, vô hạn) sẽ là một thực tế rất xấu.


1
Sẽ WAITFOR (...) TIMEOUT 3600000giải quyết vấn đề? Ví dụ phát hành hàng giờ.
AngryHacker

2
Nhật ký của bạn sẽ phát triển rất nhiều trong một giờ. WAITFOR (REC EIVE) có nghĩa là trong khoảng thời gian như 5 giây ...
Remus Rusanu

1
Bạn cũng nên điều tra lý do tại sao giao dịch của bạn thực sự hoạt động (có nhật ký bằng văn bản). Mẫu Nhà môi giới dịch vụ điển hình không đưa ra bất kỳ ghi nào trước khi NHẬN.
Remus Rusanu

1
Tôi không hiểu bình luận cuối cùng của bạn. Giao dịch đang hoạt động vì tôi đã phát hành WAITFOR (RECEIVE...Bạn có thể mở rộng không? Có lẽ, tôi đã hiểu lầm.
AngryHacker

8
begin transaction; waitfor(receive...)sẽ không tạo ra bất kỳ bản ghi nhật ký nào (sẽ không 'kích hoạt' giao dịch) trong khi chờ đợi và do đó sẽ không ghim nhật ký. Chỉ begin transaction;[insert|update|delete];waitfor(receive...)sẽ khiến giao dịch 'kích hoạt' (tạo bản ghi nhật ký) và do đó sẽ thực sự ghim nhật ký trong khi chờ đợi.
Remus Rusanu

5

Trên SQL Server 2008 R2, nếu tôi thực thi WAITFOR (NHẬN), sau đó chạy DBCC OPENTRAN, nó sẽ hiển thị giao dịch là hoạt động, ngay cả khi không có bất kỳ cập nhật nào trước đó.


2
Chính xác, WAITFOR tạo một điểm lưu trữ bên trong và điều này kích hoạt ghi nhật ký để nó ghim nhật ký vào vị trí.
Remus Rusanu


@binki bình luận đó đề cập đến SQL Server 2005. Đây là phiên bản 2008 R2. Họ hành xử khác nhau về vấn đề này, nếu tôi nhớ chính xác.
Remus Rusanu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.