Mutex хранимая процедура - PullRequest
3 голосов
/ 01 апреля 2009

Я хочу создать распределенное взаимное исключение, используя таблицу базы данных. Было бы неплохо иметь следующий интерфейс для хранимой процедуры:

Wait (UniqueIdentifier) ​​

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

Есть идеи? Если база данных не подходит для этого, существуют ли какие-либо сторонние инструменты, которые будут работать (желательно с открытым исходным кодом)?

(Чтобы избежать взаимных блокировок, я либо хочу включить тайм-аут в операцию ожидания, либо SqlCommand имеет тайм-аут)

1 Ответ

4 голосов
/ 01 апреля 2009

Взгляните на системную хранимую процедуру:

 sp_getapplock

Это может помочь вам выполнить то, что вы пытаетесь сделать.

http://msdn.microsoft.com/en-us/library/ms189823.aspx

Вы можете поместить его в процесс, который параметризует уникальный идентификатор ...

BEGIN TRAN

DECLARE @result int

EXEC @result = sp_getapplock @Resource = 'YOUR_uniqueidentifier_HERE', 
                             @LockMode = 'Exclusive',
                             @LockTimeout = 90

IF @result NOT IN ( 0, 1 )   -- Only successful return codes
BEGIN
  PRINT @result
  RAISERROR ( 'Lock failed to acquire...', 16, 1 )
END 
ELSE
BEGIN
    -- DO STUFF HERE 
END
EXEC @result = sp_releaseapplock @Resource = 'YOUR_uniqueidentifier_HERE'  

COMMIT TRAN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...