Il existe beaucoup d'informations sur Internet concernant ce "problème" courant.Sql Server 2005 - Insérer s'il n'existe pas
Solutions comme:
IF NOT EXISTS() BEGIN INSERT INTO (...) END
ne sont pas thread-safe à mon avis et vous seront probablement d'accord.
Cependant, pourriez-vous confirmer que mettre l'existence dans la clause where d'un seul select résoudrait le problème de la concurrence la plus élevée dans le moteur sql? Est-ce suffisant?
insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
Faut-il y a également ajouté un certain niveau de transaction ou peut-il être exécuté sur un par défaut: commis?
Est-ce que cela fonctionnerait sous le niveau non-validé?
Merci!
// ajouté plus tard
Puis-je supposer que les deux sql sont corrects:
1) jeu niveau d'isolation de transaction répétitive lire
IF NOT EXISTS() BEGIN INSERT INTO (...) END
2) définir le niveau d'isolation transaction de lecture répétée
insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
Non, il ne fonctionnera pas à l'une ou ReadCommitted niveau non engagé. Vous auriez besoin de quelques conseils de verrouillage supplémentaires. duplication possible de [Insertion d'une ligne seulement si elle n'est pas déjà là] (http: // stackoverflow.com/questions/3407857/only-insertion-a-row-if-its-not-already-there) –
Vous n'avez pas besoin de "help out" existe clauses - ils sont assez intelligents pour terminer après avoir vu 1 rang. vous pouvez juste faire EXISTS (SELECT * FROM ... 'et il fait la bonne chose –
il fera la bonne chose, mais dans le cas de la coccyx il n'est pas suffisamment sûr pour le filetage et les erreurs de violation primaires peuvent se produire sous haute Donc, selon le lien de @Martin, une transaction répétable d'isolation de lecture devrait être ajoutée – Paul