Est-ce le bon modèle pour faire atomique "UPSERT" (mise à JOUR où existe, INSÉRER autrement) dans SQL Server 2005?
Je vois beaucoup de code (par exemple, voir http://stackoverflow.com/questions/639854/tsql-check-if-a-row-exists-otherwise-insert) avec les deux parties ci-modèle:
UPDATE ...
FROM ...
WHERE <condition>
-- race condition risk here
IF @@ROWCOUNT = 0
INSERT ...
ou
IF (SELECT COUNT(*) FROM ... WHERE <condition>) = 0
-- race condition risk here
INSERT ...
ELSE
UPDATE ...
où < condition > fera l'objet d'une évaluation des clés naturelles. Aucune des méthodes ci-dessus semblent faire face à la concurrence. Si je ne peut pas avoir deux lignes avec la même clé naturelle, il semble que tous les ci-dessus risque de l'insertion de lignes avec le même naturel touches en condition de course des scénarios.
J'ai été en utilisant l'approche suivante, mais je suis surpris de ne pas voir partout dans les réactions des gens alors je me demandais quel est le problème avec elle:
INSERT INTO <table>
SELECT <natural keys>, <other stuff...>
FROM <table>
WHERE NOT EXISTS
-- race condition risk here?
( SELECT 1 FROM <table> WHERE <natural keys> )
UPDATE ...
WHERE <natural keys>
Notez que la condition de la course mentionné ici est différente de celles utilisées dans le code antérieur. Dans le code précédent, la question était de lectures fantômes (les lignes étant inséré entre la mise à JOUR/SI ou entre le SELECT/INSERT par une autre session). Dans le code ci-dessus, la condition de la course a à voir avec la Supprime. Est-il possible pour une ligne correspondante à être supprimée par une autre session APRÈS l' (OÙ n'EXISTE PAS) s'exécute mais avant de l'INSÉRER exécute? Il n'est pas clair où la OÙ n'EXISTE PAS pose un verrou sur quoi que ce soit en conjonction avec la mise à JOUR.
Est-ce atomique? Je n'arrive pas à trouver où ce serait documentée dans la documentation de SQL Server.
EDIT: je me rends compte de ce qui pourrait être fait avec les transactions, mais je pense que j'aurais besoin de définir le niveau des transactions SERIALIZABLE pour éviter les fantômes problème? Sûrement, c'est trop pour un tel problème commun?