Như mong đợi
-
SELECT với ORDER BY, không có ROWLOCK, không có chỉ mục sẽ có khóa bảng do quét / sắp xếp trung gian để tính ra TOP 2. Vì vậy, phiên thứ 2 bỏ qua toàn bộ bảng vì READPAST
-
SELECT không có ORDER BY chỉ chọn 2 hàng bất kỳ, ngẫu nhiên theo thứ tự chèn (hoàn toàn trùng hợp, không có thứ tự ngụ ý). Việc 2 hàng này bị khóa khiến phiên thứ 2 chuyển sang các hàng không bị khóa tiếp theo.
SQL Server cố gắng giữ cho các khóa càng chi tiết càng tốt nhưng quá trình quét có nghĩa là một khóa bảng. Bây giờ, điều này thường sẽ không tạo ra sự khác biệt (nó sẽ là một khóa đọc được chia sẻ) nhưng bạn cũng có UPDLOCK, có nghĩa là một bảng được khóa độc quyền
Vì vậy, bạn cần cả hai điều này
- 3 gợi ý trong các truy vấn CHỌN (ROWLOCK, UPDLOCK, READPAST) để kiểm soát mức độ chi tiết, cô lập và đồng thời.
Chỉ sử dụng ROWLOCK sẽ vẫn tạo ra một khóa riêng trên mọi hàng để quét / sắp xếp. - một chỉ mục trên
Value
BAO GỒMTestID
để làm cho SELECT hiệu quả. Chỉ một chỉ mục có thể sẽ khắc phục sự đồng thời nhưng nó sẽ không được đảm bảo.
Trong một trong những câu hỏi trước đây của bạn, tôi đã liên kết với câu trả lời của mình (trong một nhận xét) với Điều kiện chạy đua hàng đợi quy trình SQL Server nơi tôi có tất cả 3 gợi ý về khóa