2008-09-21 35 views
7

Có cách nào để khóa một hàng trong cơ sở dữ liệu SQL 2005-2008 mà không bắt đầu một giao dịch, vì vậy các quy trình khác không thể cập nhật hàng cho đến khi nó được mở khóa?Hàng khóa trong SQL 2005-2008

Trả lời

3

Bạn có thể sử dụng RowLock or other hints nhưng bạn nên careful ..

Các gợi ý HOLDLOCK sẽ hướng dẫn SQL Server để giữ khóa cho đến khi bạn cam kết giao dịch. Đề xuất ROWLOCK sẽ chỉ khóa bản ghi này và không phát hành trang hoặc khóa bảng.

Khóa cũng sẽ được giải phóng nếu bạn đóng kết nối hoặc nó hết giờ. Tôi sẽ rất cẩn thận làm điều này vì nó sẽ ngăn chặn bất kỳ câu lệnh SELECT nào đánh hàng này chết trong các bài hát của họ. SQL Server có nhiều gợi ý khóa mà bạn có thể sử dụng. Bạn có thể thấy chúng trong Sách trực tuyến khi bạn tìm kiếm trên HOLDLOCK hoặc ROWLOCK.

+0

Tôi đã thử điều này, nhưng nó không phải là những gì tôi muốn. Nó thực sự giữ khóa, khi tôi thực hiện một bản cập nhật. Bản cập nhật chờ cho đến khi khóa được phát hành và sau đó nó cập nhật bản ghi (đây không phải là những gì tôi muốn). Thứ hai, tôi vẫn có thể thực hiện lựa chọn mà không gặp bất kỳ vấn đề gì. – Martijn

1

Mọi thứ bạn thực hiện trong máy chủ xảy ra trong giao dịch, ngầm định hoặc rõ ràng.

Bạn không thể chỉ đơn giản là khóa một hàng không có giao dịch (chỉ đọc hàng). Bạn có thể làm cho cơ sở dữ liệu chỉ đọc, nhưng không chỉ một hàng.

Giải thích mục đích của bạn và đó có thể là giải pháp tốt hơn. Mức cách ly và gợi ý khóa và row versioning.

0

Bạn có cần khóa hàng hoặc Sql Server's Application locks làm những gì bạn cần không?

Khóa ứng dụng chỉ là một khóa có tên mà bạn có thể "khóa", "mở khóa" và kiểm tra xem khóa có bị khóa hay không. xem liên kết ở trên để biết chi tiết. (Chúng được mở khóa nếu kết nối của bạn bị đóng vv, vì vậy có xu hướng làm sạch chúng)

+0

Tôi không thể sử dụng khóa ứng dụng vì các ứng dụng khác truy cập vào hàng 'bị khóa' không biết rằng trước tiên chúng cần kiểm tra khóa ứng dụng. – alex