Запутался насчет UPDLOCK, HOLDLOCK

Изучая использование Table Hints , я натолкнулся на эти два вопроса:

В ответах на оба вопроса говорится, что при использовании (UPDLOCK, HOLDLOCK) другие процессы не смогут читать данные в этой таблице, но я этого не сделал. не вижу этого. Для проверки я создал таблицу и запустил два окна SSMS. В первом окне я запустил транзакцию, выбранную из таблицы, используя различные подсказки таблицы. Пока транзакция выполнялась, из второго окна я запускал различные операторы, чтобы увидеть, какие из них будут заблокированы.

Тестовая таблица:

CREATE TABLE [dbo].[Test](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Value] [nvarchar](50) NULL,
 CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Из окна SSMS 1:

BEGIN TRANSACTION

SELECT * FROM dbo.Test WITH (UPDLOCK, HOLDLOCK)
WAITFOR DELAY '00:00:10'

COMMIT TRANSACTION

Из окна SSMS 2 (выполнялось одно из следующих действий):

SELECT * FROM dbo.Test
INSERT dbo.Test(Value) VALUES ('bar')
UPDATE dbo.Test SET Value = 'baz' WHERE Value = 'bar'
DELETE dbo.Test WHERE Value= 'baz'

Влияние различных табличных подсказок на операторы, выполняемые в окне 2:

           (UPDLOCK)       (HOLDLOCK)    (UPDLOCK, HOLDLOCK)    (TABLOCKX)
---------------------------------------------------------------------------
SELECT    not blocked      not blocked       not blocked         blocked
INSERT    not blocked        blocked           blocked           blocked
UPDATE      blocked          blocked           blocked           blocked
DELETE      blocked          blocked           blocked           blocked

Я неправильно понять ответы, данные в этих вопросах, или сделать ошибку в моем тестировании? Если нет, зачем вам использовать только (UPDLOCK, HOLDLOCK) вместо (HOLDLOCK) ?


Дальнейшее объяснение того, что я пытаюсь сделать:

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

В этом ответе четко сказано, что (UPDLOCK, HOLDLOCK) блокирует чтение (а не то, что я хочу). Комментарии к этому ответу подразумевают, что именно HOLDLOCK предотвращает чтение. Чтобы попытаться лучше понять эффекты подсказок в таблице и посмотреть, сможет ли только UPDLOCK сделать то, что я хотел, я провел вышеупомянутый эксперимент и получил результаты, которые противоречат этим ответам.

В настоящее время я считаю, что (HOLDLOCK) - это то, что я должен использовать, но я обеспокоен тем, что, возможно, я сделал ошибку или пропустил что-то, что вернется, чтобы укусить меня в будущем, поэтому это вопрос.

83
задан Community 23 May 2017 в 10:31
поделиться