Когда мы должны вызывать метод connection.rollback ()? - PullRequest
3 голосов
/ 01 сентября 2009

Пожалуйста, дайте мне знать, когда нам требуется вызвать метод connection.rollback ();

try{
  connection = getConnection();
  connection.setAutoCommit(false);
  pstmt1 = connection.preparedstatement ( ... );
  ...
  pstt1.executeUpdate();
  pstmt2 = connection.preparedstatement ( ... );
  ...
  pstt2.executeUpdate();
  connection.commit();
}catch ( Exception sqe ) {  sqe.printStacktrace();
}finally {
  closeQuitely ( pstmt1 );
  closeQuitely ( pstmt2 );
  closeQuitely ( connection );
}

В приведенном выше коде мы не используем connection.rollback (), но если произойдет какое-то исключение, даже тогда все будет работать нормально [я думаю], потому что соединение уже установлено в режиме autoCommit = false.

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

Ответы [ 3 ]

5 голосов
/ 01 сентября 2009

Когда вы закрываете соединение, ваша транзакция будет прекращена. Большинство СУБД откатят вашу транзакцию, потому что они не знают, при каких обстоятельствах соединение было прервано (возможно, ваша программа была убита?). Так что, если вы уже зафиксировали, откат ничего не сделает.

С другой стороны, если вы используете пул соединений, когда вы закрываете соединение, диспетчер пула перехватывает его и, вероятно (надеюсь) откатит соединение и оставит соединение открытым.

Хорошей практикой является откат в предложении catch или даже в предложении finally. Как правило, не мешает делать ненужный откат после коммита.

Кроме того, если вы используете Postgres, неплохо бы откатить до запуска , чтобы убедиться, что время начала вашей транзакции сброшено. Это связано с тем, что Postgres хранит значение current_timestamp во время начала транзакции, и если вы используете пул соединений, это могло быть давно!

4 голосов
/ 01 сентября 2009

В исключительном случае ваша транзакция не разрешена. В конце концов, это истечет время ожидания, и, как вы говорите, откат. Но до тех пор (что может занять несколько минут) все блокировки, принятые вашей транзакцией, будут удерживаться. Соединение не может понять, что вы можете не только совершить коммит (). Удержание замков в течение длительного периода времени очень похоже на параллелизм.

Добавьте откат к вашему случаю исключения.

Может показаться, что закрытие вашего соединения также прекратит преобразование. При использовании простого JDBC, однако, при наличии пула соединений, как это реализовано на серверах приложений, закрытие соединения имеет семантику «возврат в пул» и , пул соединений будет сохранять связь соединения с текущей транзакцией. Если позже в вашем коде, все еще в рамках той же транзакции, вы попросите соединение, пул вернет вам то же самое соединение. Это действительно очень удобно для написания приложений Moular, но есть штраф, который нельзя допустить, чтобы закрытие соединения разрешало транзакцию.

begin tran

// call a method
    get connection

    work

    close connection

// call another method

    get connection  // you get the **same** connection still associated with the tran

    work

    close connection

commit
0 голосов
/ 01 сентября 2009

Если вы закроете соединение без фиксации, транзакция будет отменена. если вы используете пул соединений, он, вероятно, сделает это за вас.

Явный откат, вероятно, более уместен, когда вы сталкиваетесь с условием, которое не вызывает исключение, но вы все еще не хотите фиксировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...