Вопрос

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

Ожидание (уникальный идентификатор)

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

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

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

Это было полезно?

Решение

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

 sp_getapplock

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

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

Вы можете поместить это в процедуру, которая параметризует uniqueidentifier ...

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top