Java Connection.Close Rollback?
-
03-07-2019 - |
Pergunta
Java Connection.close Rollack em um bloco finalmente?.
Eu sei .NET sqlConnection.close faz isso.
Com isso, eu poderia fazer Blocks Try/Finalmente sem Catch ...
Exemplo:
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.close();
}
Solução
De acordo com o javadoc, você deve tentar comprometer ou reverter antes de chamar o método de fechamento. Os resultados de outra forma são definidos pela implementação.
Outras dicas
Em qualquer sistema de banco de dados com o qual trabalhei, não há mal em fazer uma reversão logo após a confirmação; portanto, se você se comprometer no bloco de tentativa e reverter no final, as coisas serão comprometidas, enquanto que se uma exceção ou retorno precoce causar O comprometimento a ser perdido, a reversão da transação. Então a coisa segura a fazer é
try {
conn.setAutoCommit(false);
ResultSet rs = executeQuery(conn, ...);
....
executeNonQuery(conn, ...);
....
conn.commit();
} finally {
conn.rollback();
conn.close();
}
O driver JDBC da Oracle se compromete com Close () por padrão. Você não deve confiar nesse comportamento se pretende escrever o código JDBC multiplataforma.
O comportamento é completamente diferente entre diferentes bancos de dados. Exemplos:
Oráculo
A transação é comprometida ao fechar a conexão com uma transação aberta (como @MR. Shiny e New 安宇 declarou.
servidor SQL
Chamar o método de fechamento no meio de uma transação faz com que a transação seja revertida.
É inútil reverter finalmente o bloco. Depois de se comprometer, e o comprometimento é bem -sucedido, por que reverter? Então, se eu fosse você, eu iria reverter no bloco de captura.
Para o MySQL JDBC, a implementação volta a conexão se fechada sem uma chamada para cometer ou reverter métodos.