In che modo Oracle gestisce più INSERT simultanei su una tabella


8

Sto cercando di capire Oracle 11g un po 'più da vicino. La mia domanda è semplice: in che modo Oracle gestisce due sessioni che tentano di inserire record in una singola tabella contemporaneamente.

Ad esempio, INSERISCI A viene eseguito alle 13:00 in base alla Tabella 1. Il completamento richiederà 5 minuti. INSERISCI B viene eseguito alle 13:02 in base alla Tabella 1. Il completamento richiederà 1 minuto.

Cosa accadrà? La coda Oracle INSERT B verrà eseguita al termine di INSERT A? INSERT B funzionerà contemporaneamente con INSERT A?

Grazie!


6
non c'è niente di meglio che provi tu stesso a vedere :-)
Jack dice di provare topanswers.xyz il

Assolutamente. Tuttavia, non sono sicuro di come creare una query che richiederà intenzionalmente 5 minuti per essere completata.
Dustin,

3
inserire molti dati? insert into foo(id) select level from dual connect by level<1000000(aumentando il numero di zeri uno alla volta fino a quando non è abbastanza lento)
Jack dice di provare topanswers.xyz il

Risposte:


4

Gli inserti non si influenzano a vicenda a meno che non abbiano un conflitto con vincoli di chiave univoci o primari. Dovrebbero essere indipendenti. Credo che questo problema di concorrenza sia uno dei motivi per cui la sequenza di Oracle è un oggetto separato (generazione PK surrogata nella cache, separata dall'insert).

A tale proposito, operano sul tavolo non sottoposto a commit come viene visto nella loro sessione. Questo comportamento è descritto nel post stackoverflow di seguito.

/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle


2

Forse è utile dare un'occhiata a Oracle Transaction Management (Concepts) o all'elaborazione SQL per sviluppatori di applicazioni (Guida per sviluppatori di applicazioni avanzate)

Puoi indagare sul comportamento di Oracle aprendo una sessione con sqlplus, impostando autocommit eseguendo

disattivare autocommit

ed eseguendo un inserto

inserire nella tabella valori A (...) (...);

Lasciare aperta questa sessione e avviare una sessione sqlplus da un'altra finestra, disattivare autocommit ed emettere un altro inserto. Entrambe le transazioni saranno attive fino a quando non le chiuderai con commit (o rollback).

Nella maggior parte dei casi non è necessario disattivare l'autocommit perché questa è l'impostazione predefinita per sqlplkus se non è stata modificata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.