2010-09-07 15 views
33

quiero hacer esto:SQL Server - Cómo bloquear una mesa hasta que un procedimiento almacenado termina

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 

es algo así como que sea posible?

En última instancia, quiero que mi informe de servicios de informes del servidor SQL llame al procedimiento A, y luego solo muestre la tabla a después de que el procedimiento haya finalizado. (No puedo cambiar el procedimiento A para regresar la tabla a).

+0

¿Ha considerado usar SET TRANSACTION/COMMIT. No estoy muy seguro de lo que estás tratando de lograr aquí? – MikeAinOz

+0

La respuesta de Xin fue mucho más conciso y menos intensivo en recursos. Aunque tuve que usar TABLOCKX. – RAD

Respuesta

10

Utilice la instrucción de bloqueo de TABLOCKX para su transacción. See this article para obtener más información sobre el bloqueo.

+0

Podría, alternativamente, usar UPDLOCK si está bien que otros lean la tabla mientras la está usando. –

+0

¿Dónde entra la transacción? ¿Debería envolver mi SP completo en una transacción? – Greg

+0

Para muchos SP, tiene sentido comenzar una transacción al principio y comprometerla al final. Hay, por supuesto, excepciones a esta regla, pero en general me parece una buena práctica. –

33

necesitaba esto responde a mí mismo y de la link provided by David Moye, decidieron en esto y pensé que podría ser de utilidad para otros con la misma pregunta: ¿

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

No podemos usar sp_getapplock para este – Nipuna

+1

De la documentación (https://msdn.microsoft.com/en-us/library/ms189823.aspx), parece que sp_getapplock también hará el trabajo con sp_releaseapplock siendo utilizado para liberar el bloquear. También tiene la ventaja de no necesitar estar dentro de una transacción por apariencia. – Graham

+5

TABLOCK evitará actualizaciones en otras sesiones, TABLOCKX evitará actualizaciones y lecturas. – crokusek

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

Esto mantendrá el 'bloqueo de tabla' hasta que la fin de su actual transaction.

Cuestiones relacionadas