Question

Mon scénario de cas transmet un paramètre à une procédure, qui ne fait qu'un insert. Mais deux threads pourraient essayer de passer la même valeur.

Comment gérer cette situation sans lancer une exception et avec le moins de verrous?

Mon exigence de performance est d'au moins 10 000 inserts par seconde.

ÉDITER: La colonne est unique. L'horodatage peut être modifié (ajusté) avant l'insertion.

Était-ce utile?

La solution

Créer un index sur la table avec l'option Ignore Duplicate Key. Il n'insertera pas la ligne en double et ne sera pas non plus via une erreur.

Par exemple

create unique index i1 on #tmp(id) with ignore_dup_key

insert into #tmp values(1,"A")
2> go
(1 row affected)


1> insert into #tmp values(1,"A")
2> go
Duplicate key was ignored.
(0 rows affected)

Autres conseils

Essaie le FUSIONNER déclaration

De msdn. Un scénario commun consiste à mettre à jour une ou plusieurs colonnes dans une table si une ligne correspondante existe ou l'insertion des données en tant que nouvelle ligne si une ligne correspondante n'existe pas. Cela se fait généralement en passant par des paramètres à une procédure stockée qui contient les instructions de mise à jour et d'insertion appropriées. Avec l'instruction MERGE, vous pouvez effectuer les deux tâches dans une seule instruction.

En ce qui concerne vos problèmes de performance, il y a aussi une page sur Optimisation des performances de la déclaration de fusion

Comme @Martin Smith a souligné qu'il y a une bonne solution - même si elle est contraire à ma question, elle a un bon raisonnement derrière qui semble bien soutenu. La réponse originale que vous pouvez trouver ici posté par @gbn.

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

Sérieusement, cela est le plus rapide et le plus simultané sans serrures, en particulier à des volumes élevés. Que se passe-t-il si le mise à jour est dégénéré et que la table entière est verrouillée?

Le texte original de Paul Nielsen que vous pouvez trouver ici. - Leçon 4.

Si quelqu'un a un problème similaire à la mienne, il est bon de le jeter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top