2010-09-07 9 views
33

io voglio fare questo:SQL Server - Come bloccare un tavolo fino a quando una stored procedure finisce

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 

è qualcosa di simile possibile?

In definitiva, desidero che i miei servizi di report del server SQL segnalino la procedura di chiamata A e quindi mostrano solo la tabella a al termine della procedura. (Non sono in grado di modificare la procedura A per tornare alla tabella a).

+0

Avete considerato l'utilizzo di SET TRANSACTION/COMMIT. Non sono troppo sicuro di cosa stai cercando di ottenere qui? – MikeAinOz

+0

La risposta di Xin era molto più concisa e meno dispendiosa in termini di risorse. Ho dovuto usare TABLOCKX però. – RAD

risposta

10

Utilizzare il suggerimento di blocco TABLOCKX per la transazione. See this article per ulteriori informazioni sul blocco.

+0

In alternativa, è possibile utilizzare UPDLOCK se è consentito agli altri di leggere il tavolo mentre lo si utilizza. –

+0

Da dove viene la transazione? Devo avvolgere tutto il mio SP in una transazione? – Greg

+0

Per molti SP, ha senso iniziare una transazione all'inizio e confermarla alla fine. Ci sono, naturalmente, delle eccezioni a questa regola, ma in generale trovo una buona pratica. –

33

bisogno di questo me rispondere e dal link provided by David Moye, deciso su questo e ho pensato che potrebbe essere utile ad altri con la stessa domanda:

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

Non possiamo usare sp_getapplock per questo – Nipuna

+1

Dalla documentazione (https://msdn.microsoft.com/en-us/library/ms189823.aspx), sembra che sp_getapplock faccia anche il lavoro con sp_releaseapplock usato per rilasciare il serratura. Inoltre ha il vantaggio di non aver bisogno di essere all'interno di una transazione dal suo aspetto. – Graham

+5

TABLOCK impedirà gli aggiornamenti di altre sessioni, TABLOCKX impedirebbe sia gli aggiornamenti che le letture. – crokusek

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

Questo terrà il 'blocco di tabella' fino a quando il fine del tuo attuale transaction.

Problemi correlati