Trong trường hợp của bạn, tôi khuyên bạn nên đặt mức cô lập rõ ràng cho ảnh chụp nhanh - điều này sẽ ngăn việc đọc cản trở quá trình ghi (chèn và cập nhật) bằng cách ngăn khóa, nhưng những lần đọc đó vẫn là lần đọc "tốt" (tức là không phải dữ liệu bẩn - nó không giống với NOLOCK)
Nói chung, tôi thấy rằng nơi tôi gặp vấn đề về khóa với các truy vấn của mình, tôi kiểm soát khóa được áp dụng theo cách thủ công. ví dụ. tôi sẽ thực hiện cập nhật với khóa cấp hàng để tránh khóa cấp trang / bảng và đặt số lần đọc của tôi thành readpast (chấp nhận rằng tôi có thể bỏ sót một số dữ liệu, trong một số trường hợp có thể ổn) liên kết | chỉnh sửa | xóa | cờ
CHỈNH SỬA-- Kết hợp tất cả các nhận xét thành câu trả lời
Là một phần của quá trình tối ưu hóa, máy chủ sql tránh nhận được các lượt đọc được cam kết trên một trang mà nó biết là không thay đổi và tự động quay trở lại chiến lược khóa ít hơn. Trong trường hợp của bạn, máy chủ sql giảm từ một lần đọc có thể tuần tự hóa thành một lần đọc có thể lặp lại.
H:Cảm ơn vì thông tin hữu ích đó liên quan đến việc giảm Mức độ Cô lập. Bạn có thể nghĩ về bất kỳ lý do nào mà nó sẽ sử dụng Serializable IsolationLevel ngay từ đầu, vì chúng tôi không sử dụng một giao dịch rõ ràng cho SELECT - chúng tôi hiểu rằng giao dịch ngầm sẽ sử dụng ReadComiled?
A:Theo mặc định, SQL Server sẽ sử dụng Read Commmited nếu đó là mức cách ly mặc định của bạn NHƯNG nếu bạn không chỉ định thêm chiến lược khóa trong truy vấn của mình, về cơ bản bạn đang nói với máy chủ sql "hãy làm những gì bạn nghĩ là tốt nhất, nhưng tùy chọn của tôi là Đã đọc được cam kết ". Vì SQL Server được tự do lựa chọn, vì vậy nó thực hiện để tối ưu hóa truy vấn. (Thuật toán tối ưu hóa trong máy chủ sql rất phức tạp và bản thân tôi cũng không hiểu hết về nó). Không thực thi rõ ràng trong một giao dịch không ảnh hưởng đến mức độ cô lập mà máy chủ sql sử dụng.
Hỏi:Một điều cuối cùng, có vẻ hợp lý khi SQL Server tăng Mức cô lập (và có lẽ là số lượng khóa cần thiết) để tối ưu hóa truy vấn? Tôi cũng đang tự hỏi liệu việc sử dụng lại kết nối gộp sẽ ảnh hưởng đến điều này nếu nó kế thừa Mức cách ly được sử dụng gần đây nhất?
Đáp:Máy chủ Sql sẽ thực hiện điều đó như một phần của quy trình có tên "Lock Escalation". Từ http://support.microsoft.com/kb/323630 , tôi trích dẫn:"Microsoft SQL Server tự động xác định thời điểm thực hiện báo cáo khóa. Khi đưa ra quyết định này, SQL Server sẽ tính đến số lượng khóa được giữ trong một lần quét cụ thể, số lượng khóa được giữ bởi toàn bộ giao dịch, và bộ nhớ đang được sử dụng để khóa trong toàn bộ hệ thống. Thông thường, hành vi mặc định của SQL Server dẫn đến việc khóa leo thang chỉ xảy ra ở những điểm mà nó sẽ cải thiện hiệu suất hoặc khi bạn phải giảm quá mức bộ nhớ khóa hệ thống xuống mức hợp lý hơn . Tuy nhiên, một số ứng dụng hoặc thiết kế truy vấn có thể kích hoạt khóa leo thang tại thời điểm không mong muốn và khóa bảng đã leo thang có thể chặn người dùng khác ".
Mặc dù việc nâng cấp khóa không hoàn toàn giống với việc thay đổi mức cô lập mà truy vấn đang chạy, điều này làm tôi ngạc nhiên vì tôi không mong đợi máy chủ sql có nhiều khóa hơn mức độ cô lập mặc định cho phép.