Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/05/2010, 11:00
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Teoría en transacciones

Buen día comunidad


Estudiando un poco el tema de transacciones sobre oracle y haciendo algunas pruebas, me he encontrado con algunas cosas de las cuales me gustaría saber la teoría y el funcionamiento interno que hace oracle en estos aspectos.
Código SQL:
Ver original
  1. SQL> CREATE TABLE prueba(num NUMBER);
  2.  
  3. Tabla creada.
  4.  
  5. SQL> INSERT INTO prueba VALUES(1);  
  6.  
  7. 1 fila creada.
  8.  
  9. SQL> INSERT INTO prueba VALUES(2);
  10.  
  11. 1 fila creada.
  12. SQL> ALTER TABLE prueba ADD num2 NUMBER;
  13.  
  14. Tabla modificada.
  15.  
  16. SQL> ROLLBACK;
  17.  
  18. ROLLBACK terminado.
  19.  
  20. SQL> SELECT *FROM prueba;
  21.  
  22.        NUM       NUM2
  23. ---------- ----------
  24.          1
  25.          2

De esto se deduce, que una sentencia DDL hace un commit implicito de la transacción y la finaliza, ya que al hacer rollback, los registros fueron previamente confirmados por la sentencia DDL.


Mi segunda prueba, fue la que me trajo interrogantes.
Código SQL:
Ver original
  1. SQL> INSERT INTO prueba (num) VALUES(3);
  2.  
  3. 1 fila creada.
  4.  
  5. SQL> SELECT *FROM prueba;
  6.  
  7.        NUM       NUM2
  8. ---------- ----------
  9.          1
  10.          2
  11.          3
  12.  
  13. SQL> ALTER TABLE prueba ADD num3 NUMBERS;
  14. ALTER TABLE prueba ADD num3 NUMBERS
  15.                             *
  16. ERROR en línea 1:
  17. ORA-00902: tipo de dato no válido
  18.  
  19.  
  20. SQL> ROLLBACK;
  21.  
  22. ROLLBACK terminado.
  23.  
  24. SQL> SELECT *FROM prueba;
  25.  
  26.        NUM       NUM2
  27. ---------- ----------
  28.          1
  29.          2
  30.          3

Ejecuto una sentencia DDL con un error (tipo de dato NUMBERS) y efectivamente me muestra el error. Pero al hacer rollback, me doy cuenta que aunque fue una sentencia DDL fallida, me ha ejecutado el commit implicito. :

En una tercera prueba hago esto:
Código SQL:
Ver original
  1. SQL> INSERT INTO prueba (num) VALUES(4);
  2.  
  3. 1 fila creada.
  4.  
  5. SQL> SELECT *FROM prueba;
  6.  
  7.        NUM       NUM2
  8. ---------- ----------
  9.          1
  10.          2
  11.          3
  12.          4
  13.  
  14. SQL> ALTER TABLE prueba DROP num2;
  15. ALTER TABLE prueba DROP num2
  16.                         *
  17. ERROR en línea 1:
  18. ORA-00905: falta una palabra clave
  19.  
  20.  
  21. SQL> ROLLBACK;
  22.  
  23. ROLLBACK terminado.
  24.  
  25. SQL> SELECT *FROM prueba;
  26.  
  27.        NUM       NUM2
  28. ---------- ----------
  29.          1
  30.          2
  31.          3

En este caso, aunque mandé una sentencia DDL errornea (Por un error de sintaxis), al hacer ROLLBACK si me deja deshacer los cambios.

En ultimas mi pregunta es:
Cual es la secuencia que realiza ORACLE al ejecutar sentencias DDL dentro de una transacción en curso?

Muchas gracias por su atención
__________________
Without data, You are another person with an opinion.
W. Edwads Deming