Нужен ли откат, если java.sql.Connection # commit () выдает исключение?

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Writer {


    public static void main(String args[]){
        doWrite("output.txt","Content to be appended to file");
    }

    public static void doWrite(String filePath,String contentToBeAppended){

       try(
            FileWriter fw = new FileWriter(filePath, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter out = new PrintWriter(bw)
          )
          {
            out.println(contentToBeAppended);
          }  
        catch( IOException e ){
        // File writing/opening failed at some stage.
        }

    }

}
17
задан BalusC 24 September 2010 в 21:21
поделиться

3 ответа

Я бы сделал явный откат только для целей очистки. Хотя изменения не будут сохранены в БД, в любом случае, неплохо бы явно сообщить базе данных, что вы здесь закончили. Точно так же, как вы явно закрываете соединение, не дожидаясь, пока объект Connection будет собран мусором.

Это, очевидно, не технический ответ, и мне также было бы интересно узнать, есть ли практический смысл в этом.

6
ответ дан Nikita Rybak 24 September 2010 в 21:21
поделиться

Откат важен даже в случае неудачной фиксации, в соответствии с документами Java 1.6 JDBC :

Настоятельно рекомендуется, чтобы приложение явно зафиксировало или откатило активную транзакцию до для вызова метода close. Если вызывается метод close и существует активная транзакция, результаты определяются реализацией.

Это означает, что если вы явно не вызываете откат, некоторые реализации JDBC могут вызвать коммит до закрытия соединения.

Еще одна веская причина для отката, как предложил Xepoch, и при использовании пула соединений это еще более важно. При получении соединения из пула соединений большинство реализаций выполнят connection.setAutoCommit(defaultAutoCommit) перед тем, как дать вам соединение, и в соответствии с JavaDocs:

Если этот метод вызывается во время транзакции и режима автоматической фиксации изменено, транзакция совершена

Если connection.rollback() выдает исключение - тогда это сложная задача ...

18
ответ дан MosheElisha 24 September 2010 в 21:21
поделиться

«Возвращает открытое соединение?» Если это соединение является общим в пуле (и может быть в будущем), вам не нужна другая транзакция, совершающая вашу предыдущую работу. Я видел МНОГИЕ клиенты / решения случаев подключения драйвера пула соединений, которые соответствуют интерфейсам JDBC, и Connection.close() также можно использовать, чтобы просто вернуть соединение обратно в пул.

Кроме того, лучше try{}catch{} вашего rollback() (отредактируйте, просто прочитайте весь пост, но мне всегда нравится регистрировать исключение при откате)

4
ответ дан Jé Queue 24 September 2010 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: