2010-09-07 4 views
33

Tôi muốn làm điều này:SQL Server - Làm thế nào để khóa một bảng cho đến khi một thủ tục lưu trữ kết thúc

create procedure A as 
    lock table a 
    -- do some stuff unrelated to a to prepare to update a 
    -- update a 
    unlock table a 
    return table b 

là một cái gì đó như thế có thể?

Cuối cùng tôi muốn báo cáo dịch vụ báo cáo máy chủ SQL của tôi cho thủ tục gọi A, và sau đó chỉ hiển thị bảng sau khi thủ tục kết thúc. (Tôi không thể thay đổi thủ tục A để trả về bảng a).

+0

Bạn đã cân nhắc sử dụng SET TRANSACTION/COMMIT. Tôi không chắc chắn những gì bạn đang cố gắng đạt được ở đây? – MikeAinOz

+0

Câu trả lời của Xin được chú ý nhiều hơn và ít tốn kém hơn. Tôi đã phải sử dụng TABLOCKX mặc dù. – RAD

Trả lời

10

Sử dụng gợi ý khóa TABLOCKX cho giao dịch của bạn. See this article để biết thêm thông tin về khóa.

+0

Bạn cũng có thể sử dụng UPDLOCK nếu người khác đọc bảng trong khi bạn đang sử dụng. –

+0

Giao dịch đến ở đâu? Tôi có nên bọc toàn bộ SP của tôi trong một giao dịch không? – Greg

+0

Đối với nhiều SP, bắt đầu giao dịch ngay từ đầu và cam kết cuối cùng. Có, tất nhiên, ngoại lệ cho quy tắc này, nhưng nói chung tôi thấy nó là một thực hành tốt. –

33

cần thiết này trả lời bản thân mình và từ link provided by David Moye, quyết định về vấn đề này và nghĩ rằng nó có thể được sử dụng cho người khác với cùng một câu hỏi:

CREATE PROCEDURE ... 
AS 
BEGIN 
    BEGIN TRANSACTION 

    -- lock table "a" till end of transaction 
    SELECT ... 
    FROM a 
    WITH (TABLOCK, HOLDLOCK) 
    WHERE ... 

    -- do some other stuff (including inserting/updating table "a") 



    -- release lock 
    COMMIT TRANSACTION 
END 
+1

Chúng tôi không thể sử dụng sp_getapplock cho tài liệu này – Nipuna

+1

Từ tài liệu (https://msdn.microsoft.com/en-us/library/ms189823.aspx), có vẻ như sp_getapplock cũng sẽ thực hiện công việc với sp_releaseapplock đang được sử dụng để phát hành Khóa. Cũng có lợi thế là không cần phải ở trong một giao dịch bởi vẻ ngoài của nó. – Graham

+5

TABLOCK sẽ ngăn cập nhật bởi các phiên khác, TABLOCKX sẽ ngăn chặn cả cập nhật và đọc. – crokusek

7
select top 1 * 
from table1 
with (tablock, holdlock) 

này sẽ tổ chức 'khóa bảng' cho đến khi cuối số transaction hiện tại của bạn.