Когда запись считается подходящей для UPDATE
, на нее помещается замок X
(или его страница и т. Д., В зависимости от степени детализации блокировки, выбранной двигателем).
Это предотвращает установку блокировки S
на задействованный ресурс, который необходим для получения его значения.
Поскольку для вставки значения в дочернюю таблицу требуется проверка его по родительской таблице, оператору INSERT
придется ждать, пока транзакция UPDATE
не завершится или не откатится.
Если вы сделаете PRIMARY KEY
некластеризованным, UPDATE
не должен влиять на него (если только вы не обновляете сам PRIMARY KEY
, чего не следует делать в обычных обстоятельствах), поэтому INSERT
будет успешным.
Команды ниже работают для меня:
Транзакция 1:
CREATE TABLE parent (id INT NOT NULL PRIMARY KEY NONCLUSTERED, value INT NOT NULL, parentId INT REFERENCES parent)
INSERT
INTO parent
VALUES (1, 1, NULL)
BEGIN TRANSACTION
UPDATE parent
SET value = 2
WHERE id = 1
Транзакция 2:
INSERT
INTO parent
VALUES (2, 1, 1)