update try transaction transacciones procedimientos ejemplos datos catch anidadas almacenados sql oracle transactions commit rollback

transaction - try catch sql server



¿Hay alguna diferencia entre commit y rollback en una transacción que solo tiene selects? (7)

Como no ha hecho ningún DML, sospecho que no habría diferencia entre COMMIT y ROLLBACK en Oracle. De cualquier manera, no hay nada que hacer.

El marco de aplicación interno que utilizamos en mi empresa hace que sea necesario poner cada consulta SQL en las transacciones, aunque si sé que ninguno de los comandos hará cambios en la base de datos. Al final de la sesión, antes de cerrar la conexión, confirmo la transacción para cerrarla correctamente. Me pregunto si hubo alguna diferencia particular si lo hice retroceder, especialmente en términos de velocidad.

Tenga en cuenta que estoy usando Oracle, pero creo que otras bases de datos tienen un comportamiento similar. Además, no puedo hacer nada sobre el requisito para comenzar la transacción, esa parte de la base de código está fuera de mis manos.


En general, un COMMIT es mucho más rápido que un ROLLBACK, pero en el caso de que no haya hecho nada, en realidad es el mismo.


Estoy de acuerdo con las respuestas anteriores de que no hay diferencia entre COMMIT y ROLLBACK en este caso. Puede haber una diferencia insignificante en el tiempo de CPU necesario para determinar que no hay nada que COMPROMETER contra el tiempo de CPU necesario para determinar que ROLLBACK no tiene nada. Pero, si se trata de una diferencia insignificante, podemos olvidarnos de ello de forma segura.

Sin embargo, vale la pena señalar que existe una diferencia entre una sesión que realiza un conjunto de consultas en el contexto de una sola transacción y una sesión que realiza las mismas consultas en el contexto de una serie de transacciones.

Si un cliente inicia una transacción, realiza una consulta, realiza un RETROCESO DE COMANDO, luego inicia una segunda transacción y realiza una segunda consulta, no hay garantía de que la segunda consulta observe el mismo estado de la base de datos que la primera consulta. A veces, mantener una sola vista coherente de los datos es esencial. A veces, obtener una visión más actual de los datos es esencial. Depende de lo que está haciendo.

Lo sé, lo sé, el OP no hizo esta pregunta. Pero algunos lectores pueden estar preguntándolo en el fondo de sus mentes.


Las bases de datos a menudo conservan una revista anterior a la imagen (lo que era antes de la transacción) o una revista posterior (lo que será cuando la transacción se complete). Si mantiene una imagen anterior, debe restaurarse en una reversión . Si mantiene una imagen posterior, debe reemplazar los datos en el caso de una confirmación.

Oracle tiene un diario y un espacio de reversión. El diario de transacciones acumula bloques que luego son escritos por escritores de DB. Como estos son asíncronos, casi nada relacionado con el escritor de BD tiene algún impacto en su transacción (si la cola se llena, entonces es posible que tenga que esperar).

Incluso para una transacción solo de consulta, estaría dispuesto a apostar a que hay un poco de mantenimiento de registros transaccionales en las áreas de reversión de Oracle. Sospecho que una reversión requiere algo de trabajo por parte de Oracle antes de que determine que no hay nada que retractar realmente. Y creo que esto es sincrónico con tu transacción. Realmente no puede liberar ningún bloqueo hasta que se complete la reversión. [Sí, sé que no está utilizando ninguno en su transacción, pero el problema del bloqueo es por qué creo que debe deshacerse de una reversión para poder liberar todos los bloqueos y luego finalizar su reversión].

Por otro lado, el compromiso es más o menos el resultado esperado, y sospecho que descartar el área de restitución podría ser un poco más rápido. No creó entradas de transacción, por lo que el escritor de db nunca se despertará para comprobar y descubrir que no había nada que hacer.

También espero que si bien el compromiso puede ser más rápido, las diferencias serán menores. Tan de menor importancia, que quizás ni siquiera sea capaz de medirlos en una comparación lado a lado.


La documentación establece que:

  • Oracle recomienda que finalice explícitamente cada transacción en sus programas de aplicación con una instrucción COMMIT o ROLLBACK, incluida la última transacción, antes de desconectarse de Oracle Database. Si no compromete explícitamente la transacción y el programa finaliza anormalmente, la última transacción no confirmada se retrotrae automáticamente. Una salida normal de la mayoría de las utilidades y herramientas de Oracle hace que se comprometa la transacción actual. Una salida normal de un programa precompilador de Oracle no compromete la transacción y depende de la base de datos Oracle para deshacer la transacción actual.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_4010.htm#SQLRF01110

Si quiere o elige hacer una u otra, entonces puede hacer lo mismo que no hacer nada, y simplemente comprometerlo.


Bueno, debemos tener en cuenta qué devuelve SELECT en Oracle. Hay dos modos. Por defecto, un SELECT devuelve los datos tal como se veían esos datos en el mismo momento en que la instrucción SELECT comenzó a ejecutarse (este es el comportamiento predeterminado en el modo de aislamiento READ COMMITTED, el modo transaccional predeterminado). Entonces, si se ejecutó UPDATE / INSERT después de que se emitió SELECT, eso no estará visible en el conjunto de resultados.

Esto puede ser un problema si necesita comparar dos conjuntos de resultados (por ejemplo, los lados de debta y crédito de una aplicación de libro mayor). Para eso tenemos un segundo modo. En ese modo, SELECT devuelve los datos tal como se veían en el momento en que comenzó la transacción actual (comportamiento predeterminado en READ SOLO y niveles de aislamiento SERIALIZABLES).

Entonces, al menos algunas veces es necesario ejecutar SELECT en la transacción.


Pensaría que un compromiso sería más eficiente; ya que generalmente esperaría que la mayoría de las transacciones DB se comprometieran; por lo que podría pensar que la base de datos se optimiza para este caso (en lugar de intentar ser más eficiente para una reversión).