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

CẬP NHẬT + VỚI (ROWLOCK) + CTE

NOLOCK không áp dụng cho phần truy vấn tham chiếu đến bảng được sửa đổi. Trong câu lệnh cập nhật SQL Server U-lock từng hàng một cách ngắn gọn trong khi nó đang được kiểm tra. Đây là một cơ chế tránh bế tắc. Nó ngăn nhiều bản cập nhật cho mỗi S-lock một hàng để đọc và sau đó cố gắng khóa X.

Bạn không thể làm cho khóa chữ U biến mất AFAIK. Nhưng bạn có thể giảm số lượng hàng bị khóa U xuống mức tối thiểu bị loại bỏ bằng cách tự nối:

update t1
set ...
from T t1 with (rowlock)
where t1.ID in (select TOP 5 ID from T t2 with (nolock) where ... order by ...)

Điều này thêm một chút chi phí nhưng nó cho phép bạn sử dụng NOLOCK để đọc.

Cân nhắc sử dụng cách ly ảnh chụp nhanh cho các lần đọc. NOLOCK có một số vấn đề nhất định, chẳng hạn như truy vấn hủy bỏ ngẫu nhiên.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Số sau DateTime2 có dành cho mục đích nano giây không?

  2. Tính toán kho từng sản phẩm (Mã mực)

  3. SQL Server, tìm một chuỗi giá trị tùy ý

  4. Toán tử ký hiệu và (&) trong mệnh đề WHERE của SQL Server

  5. SQL Server 2000:Ý tưởng để thực hiện truy vấn con tổng hợp nối