estaba ayudando a algunos de mis colegas con un problema de SQL. Principalmente querían mover todas las filas de la tabla A a la tabla B (ambas tablas tenían las mismas columnas (nombres y tipos)). Aunque esto se hizo en Oracle 11g, no creo que realmente importe.problema de aislamiento de transacción o enfoque incorrecto?
Su aplicación ingenua inicial fue algo así como
BEGIN
INSERT INTO B SELECT * FROM A
DELETE FROM A
COMMIT;
END
Su preocupación era si había inserciones hechas al cuadro A durante la copia de A a B y el "borrar de una" (o TRUNCATE para lo que vale la pena) Causaría pérdida de datos (eliminando las filas insertadas más nuevas en A).
Por supuesto, recomendé rápidamente almacenar los ID de las filas copiadas en una tabla temporal y luego eliminar solo las filas en A que coinciden con los IDS en la tabla temporal.
Sin embargo por curiosidad ponemos un poco de ensayo mediante la adición de un comando de espera (no recuerdo la sintaxis de PL/SQL) entre INSERT y DELETE. Luego de una conexión diferente tendríamos insertar filas durante la espera.
se observó que era una pérdida de datos por hacerlo. Reproduje todo el contexto en SQL Server y lo envolví todo en una transacción, pero aún los nuevos datos nuevos también se perdieron en SQL Server. Esto me hizo pensar que hay un error/error sistemático en el enfoque inicial.
Sin embargo, no puedo decir si fue el hecho de que la TRANSACCIÓN no estaba (de alguna manera?) Aislada de los nuevos INSERT o el hecho de que los INSERT aparecieron durante el comando WAIT.
Al final se llevó a cabo utilizando la tabla temporal sugerido por mí, pero no pudimos conseguir la respuesta a "¿Por qué la pérdida de datos". ¿Sabes por qué?
Voy con @Guy. Es mucho mejor hacer que todo sea explícito y obvio. Hacer esto usando SQL donde sea posible es menos arcano que usar niveles de aislamiento (si puedes hacerlo, por supuesto). –
La sintaxis es incorrecta: "... donde existe (Seleccione B. desde B donde B. = A. ) –