2009-07-29 4 views
6

Ich habe eine gespeicherte Prozedur für SQL Server 2000, die nur eine einzige Instanz ausführen kann, die gerade ausgeführt wird. Gibt es eine Möglichkeit zu überprüfen und sicherzustellen, dass die Prozedur derzeit nicht ausgeführt wird?Verhindern, dass eine Stored Procedure zweimal zur gleichen Zeit ausgeführt wird

Idealerweise möchte ich, dass der Code eigenständig und effizient (schnell) ist. Ich möchte auch nicht so etwas wie eine globale temporäre Tabelle erstellen, die auf ihre Existenz prüft, denn wenn die Prozedur aus irgendeinem Grund fehlschlägt, wird sie immer als ausgeführt betrachtet ...

Ich habe gesucht, ich don glaube nicht, dass das schon gefragt wurde. Wenn es war, tut mir leid.

+0

Welche Version von sql-server verwenden Sie? –

+0

Ich habe den Beitrag aktualisiert. Es tut uns leid. –

Antwort

10

ja, es gibt einen Weg. Verwenden Sie das, was als SQL Server Application locks bekannt ist.

EDIT: ja das funktioniert auch in SQL Server 2000.

+0

Ich habe es noch nicht versucht, aber das sieht aus wie die Antwort, die ich brauche. Vielen Dank! –

1

Wie wäre es mit einem Dummy-Tisch zu sperren? Das würde im Fehlerfall keine Deadlocks verursachen.

Zu Beginn der Verfahrens Prüfung
+0

Ich kann nicht sehen, wie dies in irgendeiner Weise helfen würde. Kannst du mehr ausarbeiten? –

0

wenn Datenstück ‚verschlossen‘ ist es, das Stück von Daten

Am Ende des Verfahrens, wenn nicht verriegelt entriegeln.

dh

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

Wie würde ich das erreichen? –

+0

Gute Lösung, aber es ist nicht in sich abgeschlossen ... –

5

Sie können sp_getapplocksp_releaseapplock wie im Beispiel unter Lock a Stored Procedure for Single Use Only verwenden.

Aber versuchen Sie das wirklich? Versuchen Sie, eine Transaktion mit einem high isolation level zu erhalten? Sie wären wahrscheinlich auch viel besser damit beschäftigt, diese Art von Parallelität auf Anwendungsebene zu behandeln, da im Allgemeinen höhere Sprachen viel bessere Primitive für diese Art von Dingen haben.

Verwandte Themen