2010-01-12 5 views
3

Vous recherchez simplement une confirmation ici. Nous essayons d'utiliser l'instruction de fusion pour deux tables appelées depuis C# via procs stockés. les appels sont faits à partir de threads et/ou de processus séparés. Nous obtenons des violations de clé uniques sur les deux colonnes qui composent également l'instruction on. Notre théorie pour cela est que les instructions se produisent simultanément avec les mêmes données et que l'instruction de fusion n'est pas multithread safe. Quelqu'un d'autre a ou voit ce problème avant?Déclaration de fusion Oracle non multithread

Avez-vous des idées sur les solutions à ce problème?

Dan

+1

Dano, gardez à l'esprit que vos instructions sont probablement exécutées par 2 sessions de bases de données logiques. Cela signifie 2 transactions Oracle distinctes (mais simultanées). Ainsi, le serveur Oracle voit le travail en cours dans deux sessions de serveur distinctes. Vérifiez les déclarations que vous envoyez au serveur Oracle et vérifiez vos contraintes, comme le souligne Quassnoi, elles font probablement exactement ce qu'elles sont censées faire. –

+0

Merci à tout le monde, et je comprends ce qui se passe et je peux voir la justesse de celui-ci, mais je suis surpris qu'il n'y ait pas plus de fusion sur la sécurité multithread. Dans le code C# si j'avais un objet comme dire un dictionnaire qui permettait les fusions, je verrouillerais le dictionnaire avant l'insertion, ou la mise à jour de sorte que lorsque j'apporterais des modifications au dictionnaire, deux clés de même valeur ne pourraient pas être insérées. –

Répondre

4

Oracle n'a rien à voir avec les fils et les processus du côté de l'appel. Au lieu de cela, il implémente ses propres mécanismes de verrouillage qui empêchent les mises à jour simultanées de deux sessions logiques (qui peuvent ou non être initiées par différents threads, processus et même machines).

Les violations de clé que vous voyez sont le résultat du travail (probablement correct) de ces mécanismes.

Si vous publiez la requête que vous exécutez, je serai probablement en mesure de donner une réponse plus spécifique.