Sự khác biệt lớn, TABLOCK
sẽ cố gắng lấy các ổ khóa "được chia sẻ" và TABLOCKX
ổ khóa độc quyền.
Nếu bạn đang tham gia một giao dịch và bạn lấy một chiếc khóa độc quyền trên bàn, EG:
SELECT 1 FROM TABLE WITH (TABLOCKX)
Không có quy trình nào khác có thể lấy bất kỳ ổ khóa trên bàn, nghĩa là tất cả các truy vấn cố gắng trao đổi với bàn sẽ bị chặn cho đến khi giao dịch được thực hiện.
TABLOCK
chỉ lấy một khóa chia sẻ, các khóa chia sẻ được phát hành sau khi một câu lệnh được thực thi nếu cách ly giao dịch của bạn là READ COMMITTED
(mặc định). Nếu mức độ cô lập của bạn cao hơn, ví dụ:SERIALIZABLE
, các khóa dùng chung được giữ cho đến khi kết thúc giao dịch.
Khóa dùng chung được, hmmm, được chia sẻ. Có nghĩa là 2 giao dịch đều có thể đọc dữ liệu từ bảng cùng một lúc nếu cả hai đều giữ khóa S hoặc IS trên bảng (thông qua TABLOCK
). Tuy nhiên, nếu transaction A
giữ khóa dùng chung trên bàn, transaction B
sẽ không thể lấy một khóa độc quyền cho đến khi tất cả các khóa dùng chung được giải phóng. Đọc về ổ khóa nào tương thích với ổ khóa nào tại msdn.
Cả hai gợi ý đều khiến db bỏ qua việc sử dụng các khóa chi tiết hơn (như khóa cấp hàng hoặc cấp trang). Về nguyên tắc, các khóa chi tiết hơn cho phép bạn đồng thời tốt hơn. Vì vậy, ví dụ:một giao dịch có thể đang cập nhật hàng 100 trong bảng của bạn và một hàng 1000 khác, đồng thời từ hai giao dịch (nó trở nên phức tạp với việc khóa trang, nhưng hãy bỏ qua điều đó).
Nói chung, các khóa chi tiết là những gì bạn muốn, nhưng đôi khi bạn có thể muốn giảm sự đồng thời db để tăng hiệu suất của một hoạt động cụ thể và loại bỏ nguy cơ bị khóa.
Nói chung, bạn sẽ không sử dụng TABLOCK
hoặc TABLOCKX
trừ khi bạn thực sự cần nó cho một số trường hợp phức tạp.