Досліджуючи використання підказки для таблиці , я зіткнувся з цими двома запитаннями:
Відповіді на обидва запитання говорять, що під час використання (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]
З вікна 1 SSMS:
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)
саме цим я маю скористатися, але я стурбований тим, що, можливо, припустився помилки або пропустив щось, що повернеться до мене в майбутньому, отже, це питання.