2009-07-29 10 views
6

Ho una stored procedure per SQL Server 2000 in cui è possibile eseguire una singola istanza in qualsiasi momento. C'è un modo per controllare e garantire che la procedura non sia attualmente in esecuzione?Impedire che una stored procedure venga eseguita due volte allo stesso tempo

Idealmente, mi piacerebbe che il codice fosse autonomo ed efficiente (veloce). Anche io non voglio fare qualcosa come la creazione di una tabella temporanea globale che controlla la sua esistenza perché se la procedura non riesce per qualche motivo, sarà sempre considerata come in esecuzione ...

Ho cercato, io don Penso che questo sia stato già chiesto. Se è stato, mi dispiace.

+0

Quale versione di sql-server stai utilizzando? –

+0

Ho aggiornato il post. Scusate. –

risposta

10

Sì, c'è un modo. utilizzare ciò che è noto come SQL Server Application locks.

MODIFICA: sì, funziona anche in SQL Server 2000.

+0

Non l'ho ancora provato ma sembra la risposta di cui ho bisogno. Grazie! –

1

che ne dici di bloccare un tavolo fittizio? Ciò non causerebbe deadlock in caso di guasti.

+0

Non riesco a vedere come questo possa essere d'aiuto in alcun modo. puoi elaborare di più? –

0

All'inizio del controllo procedura se parte dei dati è 'bloccato', se non bloccarla

Al termine della procedura di sbloccare il pezzo di dati.

cioè

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

Come potrei realizzare questo? –

+0

Buona soluzione ma non autonoma ... –

5

È possibile utilizzare sp_getapplocksp_releaseapplock come nell'esempio trovato in Blocca a Stored Procedure for Single Use Only.

Ma, è quello che stai davvero cercando di fare? Stai cercando di ottenere una transazione con un high isolation level? Probabilmente starai molto meglio gestendo questo tipo di concorrenza a livello di applicazione, in quanto in generale i linguaggi di livello superiore hanno primitive molto migliori per quel genere di cose.

Problemi correlati