Запретить выполнение хранимой процедуры дважды одновременно

У меня есть хранимая процедура для SQL Server 2000, которая может иметь только один экземпляр, выполняемый в любой момент. Есть ли способ проверить и убедиться, что процедура в настоящее время не выполняется?

В идеале, я хотел бы, чтобы код был автономным и эффективным (быстрым). Я также не хочу делать что-то вроде создания глобальной временной таблицы, проверяющей ее существование, потому что если процедура по какой-то причине не выполняется, она всегда будет рассматриваться как бегущий...

Я искал, я не думаю, что это было спросил. Если так, то извините.

4 ответов


да есть один способ. используйте то, что известно как блокировки приложений SQL Server.

EDIT: да, это также работает в SQL Server 2000.


можно использовать процедура sp_getapplock процедура sp_releaseapplock как в Примере, найденном в Lock a хранимая процедура только для одного использования.

но, это то, что вы действительно пытаетесь сделать? Вы пытаетесь получить транзакцию с помощью высокий уровень изоляции? Вероятно, вам также будет намного лучше обрабатывать этот тип параллелизма на уровне приложения, поскольку в целом языки более высокого уровня имеют гораздо лучшие примитивы для этого вид вещи.


Как насчет блокировки образец таблицы? Это не приведет к тупикам в случае сбоев.


в начале процедуры проверьте, заблокирована ли часть данных, если она не заблокирована

в конце процедуры разблокируйте фрагмент данных.

ie

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'