J'essaie de comprendre Oracle 11g de plus près. Ma question est simple: comment Oracle gère-t-il deux sessions qui tentent d'insérer des enregistrements dans une même table en même temps.
Par exemple, INSERT A s'exécute à 13 h 00 par rapport au tableau 1. Cela prendra 5 minutes. INSERT B est exécuté à 13h02 contre le tableau 1. Il faudra 1 minute pour terminer.
Que va-t-il se passer? La file d'attente Oracle INSERT B sera-t-elle exécutée une fois INSERT A terminée? INSERT B fonctionnera-t-il simultanément avec INSERT A?
Merci!
insert into foo(id) select level from dual connect by level<1000000
(augmentant le nombre de zéros un par un jusqu'à ce qu'il soit assez lent)Réponses:
Les insertions ne s'influencent pas mutuellement, sauf si elles sont en conflit avec des contraintes de clé unique ou primaire. Ils devraient être indépendants. Je crois que ce problème de concurrence est l'une des raisons pour lesquelles la séquence d'Oracle est un objet distinct (mise en cache, génération de substitution de PK séparée de l'insertion).
À cet égard, ils opèrent sur la table non engagée comme on le voit à leur session. Ce comportement est décrit dans le post stackoverflow ci-dessous.
/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle
la source
Il est peut-être utile de jeter un œil à Oracle Transaction Management (Concepts) ou au traitement SQL pour les développeurs d'applications (Advanced Application Developer's Guide)
Vous pouvez étudier le comportement d'Oracle en ouvrant une session avec sqlplus, en définissant la validation automatique en exécutant
désactiver la validation automatique
et exécuter un insert
insérer dans la tableA (...) valeurs (...);
Laissez cette session ouverte et démarrez une session sqlplus à partir d'une autre fenêtre, désactivez la validation automatique et émettez une autre insertion. Les deux transactions seront actives jusqu'à ce que vous les fermiez avec commit (ou rollback).
Dans la plupart des situations, il n'est pas vraiment nécessaire de désactiver la validation automatique car il s'agit de la valeur par défaut pour sqlplkus si vous ne l'avez pas modifié.
la source