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

Bạn nhầm lẫn về UPDLOCK, HOLDLOCK

Tại sao khối UPDLOCK lại chọn? Ma trận tương thích khóa hiển thị rõ ràng N đối với tranh chấp S / U và U / S, như trong Không xung đột .

Đối với HOLDLOCK gợi ý tài liệu cho biết:

HOLDLOCK:Tương đương với SERIALIZABLE. Để biết thêm thông tin, hãy xem SERIALIZABLElater trong chủ đề này.

...

SERIALIZABLE:... Quá trình quét được thực hiện với ngữ nghĩa giống như một giao dịch đang chạy ở mức độ cô lập SERIALIZABLE ...

và chủ đề Mức cô lập giao dịch giải thích ý nghĩa của SERIALIZABLE:

Không có giao dịch nào khác có thể sửa đổi dữ liệu đã được đọc bởi giao dịch hiện tại cho đến khi giao dịch hiện tại hoàn tất.

Các giao dịch khác không thể chèn các hàng mới với các giá trị khóa nằm trong phạm vi khóa được đọc bởi bất kỳ câu lệnh nào trong giao dịch hiện tại cho đến khi giao dịch hiện tại hoàn tất.

Do đó, hành vi bạn thấy được giải thích hoàn hảo bằng tài liệu sản phẩm:

  • UPDLOCK không chặn đồng thời CHỌN hoặc CHÈN, nhưng chặn bất kỳ CẬP NHẬT hoặc XÓA các hàng được chọn bởi T1
  • HOLDLOCK có nghĩa là KHOÁNG HÓA và do đó cho phép CHỌN, nhưng chặn CẬP NHẬT và XÓA của các hàng được chọn bởi T1, cũng như như bất kỳ CHÈN nào trong phạm vi được chọn bởi T1 (là toàn bộ bảng, do đó bất kỳ chèn).
  • (UPDLOCK, HOLDLOCK):thử nghiệm của bạn không hiển thị những gì sẽ chặn ngoài trường hợp trên, cụ thể là một giao dịch khác với UPDLOCK trong T2 :
    SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
  • TABLOCKX không cần giải thích

Câu hỏi thực sự là bạn đang cố gắng đạt được điều gì ? Chơi với các gợi ý về khóa với sự hiểu biết hoàn toàn tuyệt đối 110% về ngữ nghĩa khóa đang gặp rắc rối ...

Sau khi OP chỉnh sửa:

Tôi muốn chọn các hàng từ một bảng và ngăn không cho dữ liệu trong bảng đó bị sửa đổi khi tôi đang xử lý.

Bạn nên sử dụng một trong các mức cách ly giao dịch cao hơn. REPEATABLE READ sẽ ngăn không cho dữ liệu bạn đọc bị sửa đổi. SERIALIZABLE sẽ ngăn không cho dữ liệu bạn đọc bị sửa đổi dữ liệu mới được đưa vào. Sử dụng các mức cách ly giao dịch là cách tiếp cận phù hợp, trái ngược với việc sử dụng các gợi ý truy vấn. Kendra Little có một tấm áp phích đẹp thể hiện các cấp độ cô lập.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2016:Tác động đến hiệu suất của Luôn được mã hóa

  2. Trả về danh sách cấu hình thư cơ sở dữ liệu trong SQL Server (T-SQL)

  3. Một chế độ xem có nhanh hơn một truy vấn đơn giản không?

  4. Cách lọc Hàng có Giá trị Null trong Câu lệnh Chọn trong SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 110

  5. “Truy vấn không được phép trong Waitfor” Lỗi 101 trong SQL Server