2010-09-07 9 views
33

beendet Ich möchte, dies zu tun:SQL Server - Wie eine Tabelle sperren, bis eine gespeicherte Prozedur

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 

ist so etwas wie das möglich?

Schließlich möchte ich meine SQL-Server-Reporting-Services-Bericht Prozedur A aufrufen, und zeigen Sie dann nur Tabelle a, nachdem die Prozedur abgeschlossen ist. (Ich kann Prozedur A nicht ändern, um Tabelle a zurückzugeben).

+0

Haben Sie überlegt, SET TRANSACTION/COMMIT zu verwenden. Ich bin mir nicht sicher, was Sie hier erreichen wollen. – MikeAinOz

+0

Xins Antwort war viel prägnanter und weniger ressourcenintensiv. Ich musste allerdings TABLOCKX verwenden. – RAD

Antwort

10

Verwenden Sie den TABLOCKX-Sperrhinweis für Ihre Transaktion. See this article für weitere Informationen zum Sperren.

+0

Sie können alternativ UPDLOCK verwenden, wenn es für andere in Ordnung ist, die Tabelle zu lesen, während Sie sie verwenden. –

+0

Wohin kommt die Transaktion? Sollte ich meinen gesamten SP in eine Transaktion einpacken? – Greg

+0

Für viele SPs ist es sinnvoll, eine Transaktion am Anfang zu beginnen und am Ende zu committen. Es gibt natürlich Ausnahmen von dieser Regel, aber im Allgemeinen finde ich es eine gute Praxis. –

33

dies selbst benötigt beantworten und von der link provided by David Moye, entschied sich für diese und dachte, er Verwendung für andere mit der gleichen Frage sein könnte:, bis der

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

Können wir nicht sp_getapplock für diese verwenden – Nipuna

+1

Aus der Dokumentation (https://msdn.microsoft.com/en-us/library/ms189823.aspx), scheint es sp_getapplock wird auch den Job mit sp_releaseapplock für die Freigabe der sperren. Hat auch den Vorteil, nicht in einer Transaktion nach dem Aussehen zu sein. – Graham

+5

TABLOCK verhindert Aktualisierungen durch andere Sitzungen, TABLOCKX würde sowohl Aktualisierungen als auch Lesevorgänge verhindern. – crokusek

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

Dies wird halten Sie die ‚Tabellensperre‘ Ende Ihrer aktuellen transaction.

Verwandte Themen