когда откатывать транзакцию jdbc

I have been reading an interesting statement in http://download.oracle.com/javase/tutorial/jdbc/basics/transactions.html

The interesting part is:

«Перехват SQLException сообщает вам, что что-то не так, но не сообщает, что было или не было зафиксировано. Поскольку вы не можете рассчитывать на то, что ничего не было зафиксировано, вызов метода отката - единственный способ убедиться».

Так ли это на самом деле? Если я не вызываю фиксацию, но у меня есть исключение SQLException, могу ли я не рассчитывать, что ничего не будет зафиксировано? Что, если моя программа завершится без вызова фиксации или отката? Я думал, что транзакция будет автоматически отменена для меня, но это утверждение лишает меня уверенности.


person Gyozo Gaspar    schedule 02.09.2010    source источник
comment
@GyozoGasper: На самом деле это случилось со мной. Я использую jdbc с postgresql.   -  person Ashwin    schedule 06.06.2012


Ответы (2)


По сути, любая современная база данных, которую вы могли бы использовать с уровнем изоляции по умолчанию, не будет демонстрировать такое поведение. Но в конечном итоге то, что там происходит, находится вне контроля JDBC, и, насколько ему известно, вы можете использовать Informix 5 или Sybase 1988 года со слоем адаптера под капотом.

Следовательно, с точки зрения спецификации API языка высокого уровня, они должны сделать заявление, что ничего не гарантировано, если вы не используете его должным образом. По сути, это говорит о том, что это не будет считаться ошибкой на уровне JDBC, если в результате отказа от соединения без фиксации или отката некоторые выполненные операторы будут отображаться на уровне базы данных. (Обычно для большинства баз данных мы рассматриваем эту ошибку на уровне базы данных, но, опять же, JDBC - это API высокого уровня.)

person Affe    schedule 02.09.2010

вы можете проверить это, чтобы увидеть, что происходит.

Я бы порекомендовал использовать для этого Spring. Он автоматически обработает ваши откаты tx за вас.

person hvgotcodes    schedule 02.09.2010
comment
Даже если тест показывает, что все в порядке, я все равно могу ошибаться и все равно делать это неправильно. Положительный тест означает только то, что в реальной жизненной ситуации он работает нормально, но не означает, что он будет работать во всех ситуациях нормально. При определенных условиях он все равно может выйти из строя. Что, если мне придется сменить БД на другой движок? Будет ли моя программа, протестированная с Oracle, работать с таблицей MySQL ISAM? Я доверяю своему коду только тогда, когда он теоретически верен и проверен. Код, который только протестирован, с большей вероятностью потерпит неудачу позже. - person Gyozo Gaspar; 03.09.2010