Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

ĐẶT HÀNG BẰNG VÀ VỚI (ROWLOCK, UPDLOCK, READPAST)

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ỒM TestID để 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tách giá trị một cột thành nhiều giá trị cột?

  2. Xóa 1 triệu hàng trong SQL Server

  3. SQL Server không hiển thị trong Visual Studio

  4. Cách bỏ qua một tham số trong thủ tục được lưu trữ nếu giá trị của nó là null

  5. Kiểu chờ PAGEIOLATCH_SH trong SQL Server là gì?