Исследуя использование Таблицы Советов , я натолкнулся на два вопроса:
Ответы на оба вопроса говорят о том, что при использовании (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
Из окна 2 системы SSMS (запущено одно из следующих действий):
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)
- это то, что я должен использовать, но я обеспокоен тем, что, возможно, я допустил ошибку или упустил что-то, что вернется, чтобы укусить меня в будущем, отсюда и этот вопрос.