Comment Oracle gère-t-il plusieurs INSERT simultanés sur une même table

8

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!

Dustin
la source
6
rien ne vaut essayer vous-même pour voir :-)
Jack dit essayer topanswers.xyz
Absolument. Cependant, je ne sais pas comment créer une requête qui prendra intentionnellement 5 minutes.
Dustin
3
insérer beaucoup de données? 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)
Jack dit d'essayer topanswers.xyz le

Réponses:

4

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

REW
la source
2

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é.

miracle173
la source