Изучая использование подсказок по таблицам , я столкнулся с двумя вопросами:
Ответы на оба вопроса говорят о том, что при использовании (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)
vs. (HOLDLOCK)
alone?
Дальнейшее объяснение того, что я пытаюсь достичь:
Я хотел бы выбрать строки из таблицы и предотвратить изменение данных в этой таблице во время ее обработки. Я не изменяю эти данные и хотел бы разрешить чтение.
В этом ответе четко говорится, что (UPDLOCK, HOLDLOCK)
чтение будет блокироваться (а не то, что я хочу). Комментарии к этому ответу подразумевают, что это HOLDLOCK
предотвращает чтение. Чтобы попытаться лучше понять эффекты подсказок в таблице и посмотреть, сможет ли UPDLOCK
один сделать то, что я хотел, я провел вышеуказанный эксперимент и получил результаты, которые противоречат этим ответам.
В настоящее время я считаю, что (HOLDLOCK)
это то, что мне следует использовать, но я обеспокоен тем, что, возможно, совершил ошибку или пропустил что-то, что вернется, чтобы укусить меня в будущем, отсюда и этот вопрос.
источник
UPDLOCK используется, когда вы хотите заблокировать строку или строки во время оператора выбора для будущего оператора обновления. Будущее обновление может быть следующим оператором транзакции.
Другие сеансы все еще могут видеть данные. Они просто не могут получить блокировки, несовместимые с UPDLOCK и / или HOLDLOCK.
Вы используете UPDLOCK, когда хотите запретить другим сеансам изменять заблокированные вами строки. Это ограничивает их возможность обновлять или удалять заблокированные строки.
Вы используете HOLDLOCK, когда хотите, чтобы другие сеансы не могли изменять какие-либо данные, которые вы просматриваете. Это ограничивает их возможность вставлять, обновлять или удалять заблокированные вами строки. Это позволяет вам снова запустить запрос и увидеть те же результаты.
источник
(UPDLOCK,HOLDLOCK)
блок читается, и есть ли причина использовать(UPDLOCK,HOLDLOCK)
вместо просто(HOLDLOCK)
?