Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Insertion d'une ligne uniquement si elle n'y est pas déjà

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.