E o padrão "JFDI"?
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
Sério, isso é o mais rápido e simultâneo sem travas, especialmente em grandes volumes. E se o UPDLOCK for escalado e toda a tabela estiver travada?
Leia a lição 4:
Lição 4: Ao desenvolver o proc upsert antes de ajustar os índices, primeiro confiei que oIf Exists(Select…)
a linha seria acionada para qualquer item e proibiria duplicatas. Nada. Em pouco tempo havia milhares de duplicatas porque o mesmo item atingia o upsert no mesmo milissegundo e ambas as transações viam um não existe e executavam a inserção. Após muitos testes, a solução foi usar o índice exclusivo, detectar o erro e tentar novamente permitindo que a transação visse a linha e executasse uma atualização em vez de uma inserção.