Estoy tratando de entender Oracle 11g un poco más de cerca. Mi pregunta es simple: ¿cómo maneja Oracle dos sesiones que intentan insertar registros en una sola tabla al mismo tiempo?
Por ejemplo, INSERT A se ejecuta a la 1:00 PM contra la Tabla 1. Tardará 5 minutos en completarse. INSERT B se ejecuta a la 1:02 PM contra la Tabla 1. Tardará 1 minuto en completarse.
¿Lo que sucederá? ¿Se pondrá Oracle en cola INSERT B para que se ejecute después de que INSERT A haya terminado? ¿INSERT B se ejecutará simultáneamente con INSERT A?
¡Gracias!
insert into foo(id) select level from dual connect by level<1000000
(aumentando el número de ceros uno a la vez hasta que sea lo suficientemente lento)Respuestas:
Las inserciones no se afectan entre sí a menos que tengan un conflicto con restricciones de clave únicas o primarias. Deberían ser independientes. Creo que este problema de concurrencia es una de las razones por las que la secuencia de Oracle es un objeto separado (generación de PK sustituta, en caché separada de la inserción).
En ese sentido, operan en la mesa no comprometida como se ve en su sesión. Este comportamiento se describe en la publicación de stackoverflow a continuación.
/programming/3194999/dml-by-multiple-users-commit-scenarios-in-oracle
fuente
Tal vez sea útil echar un vistazo a Oracle Transaction Management (Conceptos) o Procesamiento SQL para desarrolladores de aplicaciones (Guía avanzada para desarrolladores de aplicaciones)
Puede investigar el comportamiento de Oracle abriendo una sesión con sqlplus, configurando la confirmación automática ejecutando
desactivar la confirmación automática
y ejecutando un inserto
insertar en la tabla A (...) valores (...);
Deje esta sesión abierta e inicie una sesión de sqlplus desde otra ventana, desactive la confirmación automática y emita otra inserción. Ambas transacciones estarán activas hasta que las cierre con commit (o rollback).
En la mayoría de las situaciones, no es realmente necesario desactivar la confirmación automática porque este es el valor predeterminado para sqlplkus si no ha cambiado esto.
fuente