TSQL NOLOCK VIEW и хранимая процедура

В нашей компании мы используем представления и хранимые процедуры.

Недавно мы начали реализовывать оператор NOLOCK во многих наших представлениях.

Мне было интересно: если я применяю NOLOCK к представлению, оно «просачивается» в хранимую процедуру.

Скажем, у меня есть представление под названием viewPartyPackage, а оператор представления был ...

SELECT   
    PartyPackageID, Name, Created, LastModified, Deleted 
FROM        
    dbo.PartyPackage WITH (NOLOCK) 
WHERE     
    (Deleted = 0)

а также у меня была хранимая процедура:

ALTER proc [dbo].[partypackage_Select]
    (@PartyPackageID bigint = null) 
AS 
    SELECT * 
    FROM [viewPartyPackage] PartyPackage 
    WHERE (@PartyPackageID IS NULL OR @PartyPackageID = [PartyPackageID])

Потеряю ли я функцию NOLOCK из-за того, что я вызываю из хранимой процедуры, и мне, в свою очередь, нужно будет добавить (NOLOCK) к хранимой процедуре? Или в игру вступает НОЛОК, который находится в поле зрения?


person Mike    schedule 30.07.2010    source источник
comment
Если вы хотите использовать это повсюду, используйте SET TRANSACTION READ UNCOMMITTED в начале. Знает ли ваша компания о рисках использования NOLOCK? т.е. вы можете получить неправильные числа   -  person Nick.McDermaid    schedule 24.12.2016


Ответы (2)


См. ответы на этот ТАК вопрос. Цитировать:

См. Подсказки таблиц в MSDN: «В SQL Server 2005, все подсказки блокировки распространяются на все таблицы и представления, на которые есть ссылки в представлении. Кроме того, SQL Server выполняет соответствующие проверки согласованности блокировки ».

person Oded    schedule 30.07.2010
comment
извините, что повторяю вопрос по этому посту. А как насчет обратного: если в процессе магазина есть НОЛОК, а в представлении нет НОЛОКА? - person Mike; 30.07.2010
comment
@Mike - для хранимых процедур не определен NOLOCK. Они могут определить NOLOCK для вызываемых таблиц / представлений. - person Oded; 30.07.2010

NOLOCK в представлении будет действовать независимо от того, откуда оно было вызвано.

person Fosco    schedule 30.07.2010
comment
А как насчет наоборот? если НОЛОК был в процессе магазина, а в представлении не было НОЛОК? - person Mike; 30.07.2010
comment
Если вы выберете из представления NOLOCK в хранимой процедуре, он будет использовать NOLOCK для этого конкретного вызова ... но это не волшебным образом заставит представление всегда использовать NOLOCK. - person Fosco; 30.07.2010