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();
}
Foi útil?

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.

Método Fechar (SQLServerConnection)

É 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top