Сам по себе оператор блокировки
ничего не защищает. Магия происходит только тогда, когда все потоки блокируют один и тот же объект . В вашем случае каждый поток блокирует свой собственный канал контекста, поведение будет идентичным с блокировкой или без нее.
Кроме того, из-за всех повреждений, которые процедура CLR может нанести внутри SQL, угон работника SQL для ожидания в Sleep () определенно является главным нарушителем. Я надеюсь, что вы используете его только в экспериментальных целях.
Чтобы достичь того, что вы, вероятно, хотите, т.е. выполнять только одну процедуру в любое время, используйте блокировку приложения: sp_getapplock
. Либо оберните вызов процедуры CLR в T-SQL sp_getapplock
/ sp_releaseapplock
, либо выполните sp_getapplock
для соединения с контекстом из своего кода CLR (и выполните sp_releaseapplock при выходе).