У меня есть хранимая процедура, которая не может быть выполнена одновременно.Несколько процессов вызывают эту хранимую процедуру, но жизненно важно, чтобы процессы обращались к хранимой процедуре последовательно.
Хранимая процедура в основном сканирует таблицу на предмет первичного ключа, который удовлетворяет различным условиям, помечает запись какиспользуется вызывающим процессом, а затем передает первичный ключ обратно вызывающему процессу.
Может существовать от одного до десятка экземпляров вызывающего процесса, в зависимости от объема работы.
Я решил предотвратить параллелизм, используя sp_GetAppLock
внутри хранимой процедуры.Я получаю эксклюзивную блокировку транзакции с @Resource
, установленным на строку, которая используется только внутри этой хранимой процедуры.Единственной вещью, которая когда-либо блокируется этой блокировкой, является выполнение этой хранимой процедуры.
Вызов внутри хранимой процедуры выглядит следующим образом:
sp_getapplock @Resource='My Unique String Here'
,@LockMode='Exclusive' -- Type of lock
,@LockOwner='Transaction' -- Transaction or Session
,@LockTimeout = 5000
Он работает плавно.Если запущены дюжины экземпляров моего процесса, только один из них выполняет хранимую процедуру в любой момент времени, в то время как остальные 11 послушно стоят в очереди и ждут своей очереди.
Единственная проблема - это наш администратор БД.Он очень хороший администратор баз данных, который постоянно отслеживает блокировку базы данных и получает предупреждение, когда она превышает определенный порог.Мое использование sp_getapplock
вызывает много предупреждений.Мой администратор БД утверждает, что блокирование само по себе является проблемой производительности.
Является ли его утверждение точным?Я чувствую, что это «хорошая» блокировка, в которой единственное, что блокируется, - это выполнение хранимой процедуры, и я хочу , чтобы ее заблокировали.Но мой администратор БД говорит, что принуждение SQL Server к принудительному блокированию приводит к значительному сокращению ресурсов.
Могу ли я сказать ему «подавить взломанный канал», как мы привыкли говорить?Или я должен переписать свое приложение, чтобы избежать необходимости sp_getapplock
?
Статья, которую я прочитал и продала мне sp_getapplock
, находится здесь: sp_getapplock