Thỉnh thoảng tôi nhận được "Không thể tiếp tục quét NOLOCK
do di chuyển dữ liệu" với một số công việc lớn, có WITH (NOLOCK)
các truy vấn được chọn.
Tôi hiểu điều này có liên quan đến việc cố gắng chọn dữ liệu khi có sự phân tách trang khiến dữ liệu không còn ở nơi đáng lẽ phải xảy ra - Tôi cho rằng đó là những gì đang xảy ra trong môi trường của tôi.
Làm thế nào tôi có thể tái tạo điều này?
Tôi đang cố gắng thực hiện một cách giải quyết ngắn hạn để bắt lỗi và thử lại khi điều này xảy ra, nhưng tôi không thể kiểm tra nếu tôi không thể tái tạo nó. Có một cách hợp lý đáng tin cậy để gây ra điều này?
Khi điều đó xảy ra, việc thực hiện lại truy vấn sẽ dẫn đến thành công - vì vậy tôi thực sự không có bất kỳ lo ngại nào về dữ liệu thực tế hoặc cơ sở dữ liệu bị hỏng vĩnh viễn. Một số bảng trong truy vấn (cùng với các chỉ mục của chúng) bị bỏ, được tạo lại và được lặp lại thường xuyên, vì vậy tôi cho rằng đó là một cái gì đó liên quan đến điều đó.
Loại bỏ NOLOCK
là vấn đề dài hạn của tôi để giải quyết. Lý do NOLOCK
được đặt ở đó ngay từ đầu là vì các truy vấn rất tệ đến nỗi chúng bế tắc với các giao dịch hàng ngày, do đó, NOLOCK
một viện trợ ban nhạc để ngăn chặn các bế tắc (hoạt động). Vì vậy, tôi cần một ban nhạc hỗ trợ cho một ban nhạc cho đến khi chúng tôi có thể làm một giải pháp lâu dài.
Nếu tôi có thể tái tạo nó bằng Hello World, tôi sẽ lên kế hoạch cho việc hỗ trợ ban nhạc vào công việc trong vòng chưa đầy một giờ. Không thể thực hiện xóa và tìm kiếm thay thế NOLOCK
, bởi vì tôi bắt đầu gặp lại các bế tắc ứng dụng, điều này đối với tôi tệ hơn là một công việc không thường xuyên xảy ra.
Sử dụng đọc cách ly ảnh chụp đã cam kết là một khả năng tốt - tôi sẽ phải làm việc với nhóm cơ sở dữ liệu của chúng tôi để biết thêm chi tiết về điều đó. Một phần của vấn đề của chúng tôi là chúng tôi không có chuyên gia SQL Server để giải quyết vấn đề đó và tôi không hiểu rõ các mức cô lập đủ để thực hiện thay đổi đó ngay bây giờ.
DEADLOCK_PRIORITY
để LOW
trong công việc, do đó nếu có sự bế tắc, các công việc sẽ thất bại, và không phải là các ứng dụng. Sau đó, bạn có thể nghiên cứu các bế tắc và tìm hiểu lý do tại sao chúng đang xảy ra và khắc phục vấn đề đó. Nó có thể là một sửa chữa rất đơn giản, như hoán đổi thứ tự của hai câu lệnh. Dù vấn đề là, NOLOCK
là không phải là giải pháp , vì vậy ngừng cố gắng để buộc nó phải chỉ vì đó là đơn giản nhất.
NOLOCK
khỏi những công việc này? 601 nên là ít lo lắng nhất của bạn nếu kết quả của các truy vấn này được cho là chính xác . Paul White cho thấy một ví dụ đặc biệt khủng khiếp về việc đọc dữ liệu không nên có ở đây .