Запретить выполнение хранимой процедуры дважды одновременно
У меня есть хранимая процедура для 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'