2009-07-29 1 views
6

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

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

Я искал, Думаю, это еще не спрошено. Если это было, извините.

+0

Какую версию sql-сервера вы используете? –

+0

Я обновил сообщение. Сожалею. –

ответ

10

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

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

+0

Я еще не пробовал, но это похоже на тот ответ, который мне нужен. Благодаря! –

1

как насчет блокировки стола-заглушки? Это не вызовет взаимоблокировок в случае сбоев.

+0

Я не вижу, как это могло бы помочь в любом случае. можете ли вы подробнее рассказать? –

0

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

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

т.е.

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

Как бы это сделать? –

+0

Хорошее решение, но оно не самодостаточно ... –

5

Вы можете использовать sp_getapplocksp_releaseapplock, как в примере, найденном в Lock a Stored Procedure for Single Use Only.

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