Nous avons un système C# qui crée une anomalie que nous ne pouvons pas atteindre en bas avec SQL (SQL2k5). En l'occurrence, deux processus distincts s'exécutent simultanément sur la même table, tous deux s'exécutant à l'intérieur de leur propre transaction dans deux composants COM + desservis différents sur deux clusters différents. Les deux parlent à Order
et OrderItem
des tables SQL. Les deux fonctionnent au niveau d'isolement READ COMMITTED
.Transaction SQL Bizarrerie avec les processus concurrents de C#
Travail 1: Chargement d'une commande et un ou plus d'articles dans ces tableaux.
Job 2: Une tâche planifiée qui se produit toutes les quelques minutes de ladite sélection tables trouver toutes les commandes qui ont été entièrement traitées.
Le problème: Ce que nous avons trouvé que quatre fois au cours des huit derniers mois travail 2 a réagi à un ordre partiellement chargé du travail 1, avant le travail 1 a dûment rempli (comme un élément de l'ordre n'a pas été stocké, il est à un état fini, donc est vu par le travail que le reste de la commande est encore à charger).
De l'enquête, alors que l'emploi 1 est en cours, nous ne pouvons pas faire un:
select * de l'ordre
une fois qu'une commande a été insérée en elle. Cependant, nous pouvons faire:
select * fromOrder o jointure interne OrderItem oi sur oi.orderid = o.id
en même temps (pourquoi est-ce?). Lors d'une recherche reproduisant les mêmes circonstances, nous ne pouvons pas obtenir le travail 2 pour voir un ordre partiellement créé du travail 1, il renvoie des lignes mais jamais l'ordre n'est inséré par le travail 1. Cependant, c'est exactement ce qui se passe dans notre environnement en direct!
Quelqu'un a-t-il un aperçu de la raison pour laquelle cela se produit?