2008-12-22 18 views
5

Nếu tôi CHỌN một hàng để cập nhật trong MS SQL Server, và muốn khóa nó cho đến khi tôi cập nhật hoặc hủy, tùy chọn nào tốt hơn: -Khóa bi quan trong T-SQL

1) Sử dụng gợi ý truy vấn như UPDLOCK 2) Sử dụng mức cô lập READ REPATATABLE cho giao dịch 3) bất kỳ tùy chọn nào khác.

Xin cảm ơn, Chak.

Trả lời

3

Không. Bạn hầu như không bao giờ muốn giữ một giao dịch mở khi người dùng của bạn nhập dữ liệu. Nếu bạn để thực hiện khóa bi quan như thế này, mọi người thường làm điều đó bằng cách cuộn chức năng của riêng họ.

Xem xét toàn bộ chi nhánh của những gì bạn đang làm. Tôi đã từng làm việc trên một hệ thống thực hiện khóa như thế này. Bạn thường chạy vào tấn ổ khóa cũ, và người dùng của bạn bị lẫn lộn và tức giận rất nhanh khi bạn bỏ qua điều này trên chúng. Giải pháp cho chúng tôi trong trường hợp của chúng tôi là xóa hoàn toàn chức năng khóa này.

+1

Lưu ý rằng tình hình của OP có thể không liên quan gì đến việc nhập dữ liệu của người dùng cuối. – RoadWarrior

8

Nếu bạn đang chờ một tài nguyên khác, chẳng hạn như người dùng cuối, hãy nhận lời khuyên của Dave Markle và đừng làm điều đó.

Nếu không, hãy thử mã T-SQL sau:

BEGIN TRAN 

SELECT * 
FROM authors AU 
WITH (HOLDLOCK, ROWLOCK) 
WHERE AU.au_id = '274-80-9391' 

/* Do all your stuff here while the row is locked */ 

COMMIT TRAN 

Các HOLDLOCK gợi ý một cách lịch sự hỏi SQL Server để giữ khóa cho đến khi bạn cam kết giao dịch. ROWLOCK gợi ý lịch sự yêu cầu SQL Server chỉ khóa hàng này thay vì phát hành một trang hoặc khóa bảng. Hãy lưu ý rằng nếu nhiều hàng bị ảnh hưởng, SQL Server sẽ chủ động và leo thang tới khóa trang, hoặc bạn sẽ có toàn bộ quân đội khóa hàng làm đầy bộ nhớ máy chủ của bạn và xử lý bogging xuống.

0

chỉ cần lưu ý rằng mặc dù sử dụng ROWLOCK SQL Server có thể chọn vẫn lấy khóa toàn bộ trang nếu thấy cần thiết.

Các vấn đề liên quan