Qu'en est-il du modèle "JFDI" ?
BEGIN TRY
INSERT etc
END TRY
BEGIN CATCH
IF ERROR_NUMBER() <> 2627
RAISERROR etc
END CATCH
Sérieusement, c'est le plus rapide et le plus simultané sans verrous, en particulier à des volumes élevés. Que se passe-t-il si le UPDLOCK est augmenté et que toute la table est verrouillée ?
Lisez la leçon 4 :
Leçon 4 : Lors du développement du processus d'upsert avant de régler les index, j'ai d'abord fait confiance au
If Exists(Select…)
la ligne se déclencherait pour n'importe quel élément et interdirait les doublons. Non. En peu de temps, il y avait des milliers de doublons car le même élément atteignait l'upsert à la même milliseconde et les deux transactions voyaient un non existe et effectuaient l'insertion. Après de nombreux tests, la solution consistait à utiliser l'index unique, à détecter l'erreur et à réessayer en permettant à la transaction de voir la ligne et d'effectuer une mise à jour au lieu d'une insertion.