¿Cómo maneja Oracle múltiples INSERTs concurrentes contra una tabla?


8

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!


66
nada mejor que intentarlo tú mismo para ver :-)
Jack dice que intente topanswers.xyz

Absolutamente. Sin embargo, no estoy seguro de cómo crear una consulta que intencionalmente tardará 5 minutos en completarse.
Dustin

3
insertar muchos datos? 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)
Jack dice que intente topanswers.xyz

Respuestas:


4

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


2

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.