Хранимая Процедура Мьютекса
-
22-08-2019 - |
Вопрос
Я хочу создать некоторое распределенное взаимное исключение, используя таблицу базы данных.Было бы неплохо иметь следующий интерфейс для хранимой процедуры:
Ожидание (уникальный идентификатор)
Изначально я думал реализовать это, создав таблицу уникальных идентификаторов.Вызов процедуры будет ждать до тех пор, пока уникальный идентификатор не исчезнет из таблицы.Однако я не уверен, как бы я заставил вызывающий поток проснуться, когда указанный уникальный идентификатор был удален из таблицы.
Есть какие-нибудь идеи?Если база данных не является подходящим местом для этого, существуют ли какие-либо сторонние инструменты, которые могли бы работать (предпочтительно с открытым исходным кодом)?
(Чтобы избежать взаимоблокировок, я либо хочу включить тайм-аут в операцию ожидания, либо у 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