SQL Insert, если не существует, затем выберите, не будучи жертвой тупика - PullRequest
0 голосов
/ 31 мая 2018

Итак, мой процесс выглядит следующим образом

IF Exists () 
 Select

Else 
 Set Transaction isolation level serializable
 Begin Tran
 If not exists()
  Insert
 Select
Commit Tran

Когда я запускаю процесс одновременно, я получаю

"Transaction was deadlocked on lock resources with anothre process and has been chosen as the deadlock victim.."

Это сделано специально?Могу ли я заставить второй процесс ждать вместо того, чтобы стать жертвой?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Одним из способов избежать тупика является добавление подсказки (UPDLOCK) в подзапрос NOT EXISTS.UPDLOCK несовместим с другими UPDLOCK, поэтому доступ к одному и тому же ресурсу несколькими сеансами, выполняющими один и тот же процесс, будет сериализован.Блокировка будет удерживаться на протяжении транзакции и сниматься в течение COMMIT.

IF NOT EXISTS(SELECT 1 FROM dbo.YourTable WITH (UPDLOCK) WHERE YourKey = @YourKey)
0 голосов
/ 31 мая 2018

Поместите эту команду в начале хранимой процедуры:

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