Java Connection.close esegue il rollback?
-
03-07-2019 - |
Domanda
Java Connection.clude il rollback in un blocco finally ?.
Lo so .Net SqlConnection.close lo fa.
Con questo ho potuto provare / finalmente a bloccare senza prendere ...
Esempio:
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.close();
}
Soluzione
Secondo javadoc , dovresti provare a eseguire il commit o il rollback prima di chiamare il metodo close. In caso contrario, i risultati sono definiti dall'implementazione.
Altri suggerimenti
In qualsiasi sistema di database con cui ho lavorato, non c'è nulla di male nel fare un rollback subito dopo il commit, quindi se commetti nel blocco try e rollback nel infine, le cose vengono impegnate, mentre se un'eccezione o la restituzione anticipata causa la perdita del commit, il rollback eseguirà il rollback della transazione. Quindi la cosa sicura da fare è
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.rollback();
conn.close();
}
Il driver JDBC di Oracle si impegna su close () per impostazione predefinita. Non devi fare affidamento su questo comportamento se intendi scrivere codice JDBC multipiattaforma.
Il comportamento è completamente diverso tra database diversi. Esempi:
Oracle
La transazione viene impegnata quando si chiude la connessione con una transazione aperta (come indicato da @Mr. Shiny e New ? ?.
SQL Server
La chiamata al metodo close nel mezzo di una transazione provoca il transazione da ripristinare.
È inutile eseguire il rollback nel blocco infine. Dopo aver eseguito il commit e il commit ha esito positivo, perché ripristinare? Quindi se fossi in te, farei un rollback nel blocco catch.
Per MySQL JDBC, l'implementazione ripristina la connessione se chiusa senza una chiamata ai metodi di commit o rollback.