2009-07-29 32 views
6

Tengo un procedimiento almacenado para SQL Server 2000 que solo puede tener una instancia única ejecutándose en un momento dado. ¿Hay alguna manera de verificar y garantizar que el procedimiento no esté actualmente en ejecución?Impedir que un procedimiento almacenado se ejecute dos veces al mismo tiempo

Idealmente, me gustaría que el código sea autónomo y eficiente (rápido). Tampoco quiero hacer algo así como crear una tabla temporal global comprobando su existencia porque si el procedimiento falla por algún motivo, siempre se considerará que se está ejecutando ...

He buscado, I don No creo que esto haya sido preguntado todavía. Si lo ha sido, lo siento.

+0

¿Qué versión de sql-server estás usando? –

+0

He actualizado la publicación. Lo siento. –

Respuesta

10

sí, hay un camino. use lo que se conoce como SQL Server Application locks.

EDITAR: si esto también funciona en SQL Server 2000.

+0

No lo he probado todavía, pero esta parece ser la respuesta que necesito. ¡Gracias! –

1

¿qué tal el bloqueo de una mesa ficticia? Eso no causaría bloqueos en caso de fallas.

+0

no veo cómo esto podría ayudar de ninguna manera. puedes elaborar más? –

0

Al comienzo del control de procedimiento si parte de los datos es 'bloqueada', si no que encaje

Al final del procedimiento de desbloquear la pieza de datos.

es decir

SELECT @IsLocked=IsLocked FROM CheckLockedTable Where spName = 'this_storedProcedure' 

IF @IsLocked = 1 
    RETURN 
ELSE 
    UPDATE CheckLockedTable SET IsLocked = 1 Where spName = 'this_storedProcedure' 

. 
. 
. 

-- At end of Stored Procedure 
    UPDATE CheckLockedTable SET IsLocked = 0 Where spName = 'this_storedProcedure' 
+0

¿Cómo puedo lograr esto? –

+0

Buena solución, pero no es independiente ... –

5

Puede usar sp_getapplocksp_releaseapplock como en el ejemplo encontrado en Lock a Stored Procedure for Single Use Only.

Pero, ¿eso es lo que realmente estás tratando de hacer? ¿Estás tratando de obtener una transacción con un high isolation level? También es probable que sea mucho mejor manejar ese tipo de concurrencia en el nivel de aplicación ya que en general los lenguajes de nivel superior tienen primitivas mucho mejores para ese tipo de cosas.

Cuestiones relacionadas