Прерванная транзакция изоляции моментального снимка - обновите «родительский» и вставьте «дочерний» - PullRequest
0 голосов
/ 04 июля 2018

Учитывая следующую модель данных:

enter image description here

Мы выполняем две отдельные транзакции с «изоляцией моментальных снимков».

Транзакция № 1: Вставка дочерних записей.

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

BEGIN TRAN
WAITFOR DELAY '00:00:05'

INSERT INTO [Snapshotsch].[dbo].[Child] ([Id], [Name], [ParentId])
VALUES (NEWID(), 'AAAA', 'A130AC13-F2E4-4ABD-8D5B-8DD33E472C58')

WAITFOR DELAY '00:00:05'

INSERT INTO [Snapshotsch].[dbo].[Child] ([Id], [Name], [ParentId])
VALUES (NEWID(), 'BBBB', 'A130AC13-F2E4-4ABD-8D5B-8DD33E472C58')

WAITFOR DELAY '00:00:05'

COMMIT TRAN

Транзакция № 2: обновление записи «Родитель».

SET TRANSACTION ISOLATION LEVEL SNAPSHOT

BEGIN TRAN
WAITFOR DELAY '00:00:05'

UPDATE [Snapshotsch].[dbo].[Parent]
SET [Name] = 'AAAAA'
WHERE [Id] = 'A130AC13-F2E4-4ABD-8D5B-8DD33E472C58'

WAITFOR DELAY '00:00:05'

COMMIT TRAN

Когда я выполняю эти транзакции одновременно, происходит сбой с ошибкой:

Msg 3960, Level 16, State 2, Line 6
Snapshot isolation transaction aborted due to update conflict. 
You cannot use snapshot isolation to access table 'dbo.Parent' 
directly or indirectly in database 'Snapshotsch' to update, 
delete, or insert the row that has been modified or deleted 
by another transaction. Retry the transaction or change the 
isolation level for the update/delete statement.

Что мы можем сделать, чтобы эти транзакции выполнялись одновременно? Для меня очевидно, что обнаружение конфликта изоляции моментального снимка вызывает эту ошибку, но, поскольку здесь нет реального конфликта, мне интересно, сможем ли мы исправить его с помощью какого-либо совета или настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...