J'ai deux processus qui fonctionnent avec des données dans la même table.Concurrence - un processus se met à jour, un autre insère
Un processus insère quotidiennement, un par un (ADO.NET pur), environ 20000 enregistrements dans la table cible.
Le second appels de processus (périodiquement, toutes les 15 minutes) une procédure stockée qui
- détecte les doublons dans ces 20000 dossiers en regardant tous les dossiers arrière 7 jours et les marque en tant que telle.
- Marque tous les enregistrements qui ne sont pas des doublons avec un indicateur 'ToBeCopied'.
- Sélectionnez un nombre de colonnes parmi les enregistrements marqués comme 'ToBeCopied' et renvoyez l'ensemble.
Parfois, ces deux processus se chevauchent (en raison de retards dans le traitement des données) et je suis Soupçonnant que si le premier processus insère de nouveaux enregistrements lorsque le deuxième processus est quelque part entre 1 et 2 alors les enregistrements seront marqués « ToBeCopied » sans avoir passé à travers le tamisage en double.
Cela signifie que la procédure de stockage renvoie maintenant des doublons.
C'est ma théorie mais en pratique, je n'ai pas été en mesure de le reproduire ...
J'utilise LINQ to SQL pour insérer des doublons (40-50 ou si une seconde) et tout cela est en cours d'exécution I J'appelle manuellement la procédure stockée et stocke ses résultats.
Il semble que lorsque la procédure stockée est en cours d'exécution, les pauses d'insertion ... de telle sorte qu'à la fin, aucun doublon n'a été ajouté au jeu de résultats final. Je me demande si LINQ to SQL ou SQL Server a un mécanisme par défaut qui empêche la simultanéité et met en pause l'insertion pendant que la sélection ou la mise à jour a lieu.
Qu'en pensez-vous?
EDIT 1:
Les 'doublons' ne sont pas des rangées identiques. Ils sont 'équivalents' étant donné les entités métier/logiques que ces enregistrements représentent. Chaque ligne a une clé primaire unique.
P.S. La sélection du jeu de résultats a lieu avec NOLOCK. Essayer de reproduire sur SQL Server 2008. Un problème est censé survenir sur SQL Server 2005.
+1. Bien que, pour être juste, cela ressemble à une sorte de table de transfert, qui stocke les données brutes pour le nettoyage, qui plus tard déplace les données "propres" à la destination finale. Votre 4ème puce semble être le nœud du problème. –
Les 'doublons' ne sont pas des enregistrements physiques en double. Ce sont des lignes distinctes avec une clé primaire unique. Nous considérons que certains documents sont «équivalents» (ce mot pourrait peut-être mieux vous satisfaire) et nous les traitons comme tels. – Rire1979
La détection des doublons se produit dans une opération INSERT-SELECT. Marquer les enregistrements non dupliqués comme 'ToBeCopied' se produit comme une deuxième étape (comme décrit à l'origine). Le problème que la question tente de résoudre est pourquoi mon installation ** ne peut pas ** reproduire ce problème. Ce n'est pas que je m'attends à ce que Linq-to-SQL le répare magiquement. Je travaille sur une reproduction de bug. – Rire1979