Fue una decisión de diseño de Oracle, probablemente hecha hace más de 20 años. No es el diseño que hubiera usado. Tenga en cuenta que parece ser una propiedad de SQL * Plus, no del OCI subyacente.
Si la sesión finaliza abruptamente, AFAIK, la sesión se revierte, como era de esperar. Entonces, por ejemplo, si alguien envía un SIGKILL a SQL Plus, la transacción de la sesión debe revertirse. Pero si la sesión SQL Plus finaliza correctamente (EOF o exit command), SQL * Plus en su sabiduría infinita decide cometer lo que haya hecho hasta ahora.
En cuanto a por qué - Tengo una teoría. En las bases de datos SQL estándar, siempre está en una transacción, incluso si la única operación que ha realizado es una instrucción SELECT. Si no se compromete, se revierten los cambios que realice. Es fácil olvidarse de agregar compromiso al final de las operaciones con guiones, por lo que convertirlo en el comportamiento predeterminado redujo el número de veces que alguien ejecutó una secuencia de comandos para cambiar la base de datos y luego ejecutó una segunda secuencia de comandos para ver si los cambios surtieron efecto. Otros DBMS obvian la necesidad de esto con modos como 'autocompromiso', donde cada declaración es una transacción independiente, confirmada automáticamente al finalizar. Ese es un modo de operación útil. Otros sistemas proporcionan un modo en el que está en autocompromiso hasta que ejecuta una instrucción BEGIN WORK explícita, con lo cual (por supuesto), se encuentra en una transacción hasta el COMPROMISO o ROLLBACK correspondiente. Las bases de datos 'MODE ANSI' me han sorprendido al no comprometerse lo suficiente para asegurarme de que me comprometa cuando sea importante, pero el software que utilizo (no Oracle) todavía revierte el trabajo no comprometido en lugar de comprometerlo en silencio, y yo lo haría ser infeliz si fue cambiado para funcionar de otra manera. (Supongo que un valor predeterminado configurable podría estar bien, todavía creo que la reversión no comprometida es la mejor opción predeterminada, ya que es una molestia para el desconocedor, hay menos peligro de corromper accidentalmente una base de datos, y eso es de suma importancia para mí).
(Debido aviso: Esta es información de segunda mano de alguien que trabaja para otro proveedor de DBMS es, sin embargo, precisa en lo que sé, y en base a la información acumulada a lo largo de un período de más de una década. . y después de preguntar preguntas relacionadas en diversos foros)
En cuanto al cambio, es probable que haya miles de secuencias de comandos que se romperían si se cambiara el comportamiento predeterminado. Si fuera una opción configurable (de alguna manera), tal vez estaría bien cambiar el valor predeterminado, pero no de lo contrario. Así es la vida con el software que se ha distribuido por más de 1 minuto, no se pueden cambiar las decisiones fácilmente. –
Creo que se puede cambiar fácilmente. Me he encontrado con problemas con SQL * Plus no autocommitting y eso realmente confunde a las personas, o tal vez fue porque aún no se había comprometido ya que la aplicación todavía estaba abierta. – wowest
Está disponible como una opción en el nuevo 11gR2 SQL * Plus –