transaction statement preparedstatement parameter executeupdate example begin java transactions database-connection

parameter - preparedstatement java



¿Java Connection.close rollback? (6)

¿Java Connection.close rollback en un bloque finalmente ?.

Sé que .Net SqlConnection.close lo hace.

Con esto podría hacer try / finally blocks sin catch ...

Ejemplo:

try { conn.setAutoCommit(false); ResultSet rs = executeQuery(conn, ...); .... executeNonQuery(conn, ...); .... conn.commit(); } finally { conn.close(); }


De acuerdo con javadoc , debe intentar confirmar o revertir antes de llamar al método de cierre. Los resultados de lo contrario están definidos por la implementación.



En cualquier sistema de base de datos con el que he trabajado, no hay daño al hacer un rollback justo después del commit, así que si comprometes en el try bloque y lo relanza al final, las cosas se comprometen, mientras que si una excepción o causas de retorno temprano el compromiso que se debe perder, la reversión revertirá la transacción. Entonces, lo más seguro es

try { conn.setAutoCommit(false); ResultSet rs = executeQuery(conn, ...); .... executeNonQuery(conn, ...); .... conn.commit(); } finally { conn.rollback(); conn.close(); }


Es inútil retroceder en bloque finalmente. Después de comprometerse, y la confirmación es exitosa, ¿por qué retroceder? Entonces, si fuera tú, retrocedería en el bloque catch.


El comportamiento es completamente diferente entre diferentes bases de datos. Ejemplos:

Oráculo

La transacción se confirma al cerrar la conexión con una transacción abierta (como lo indicaron @Mr. Shiny y New 安 宇.

servidor SQL

Llamar al método de cierre en el medio de una transacción hace que la transacción se retrotraiga.

Método cercano (SQLServerConnection)


Para MySQL JDBC, la implementación retrotrae la conexión si se cierra sin una llamada a métodos commit o rollback.