Поведение активной транзакции при закрытии соединения? - PullRequest
5 голосов
/ 03 июля 2011

Если вызывается метод close и существует активная транзакция, что произойдет с активными транзакциями?Будут ли они совершены или отменены?

Ответы [ 2 ]

4 голосов
/ 13 марта 2014

Добавляя к другому ответу, я проверил поведение на Oracle и SQL Server, базах данных, с которыми я сейчас работаю.

MSSQL откатывает транзакцию. Это то, что вы ожидаете интуитивно.

Oracle с другой стороны, совершает транзакцию. Это задокументировано в их Руководстве по JDBC :

Если режим автоматической фиксации отключен и вы закрываете соединение без явной фиксации или отката последних изменений, выполняется неявная операция COMMIT.

Конечно, спецификация JDBC дает вам свободу в любом случае, но я лично считаю, что неявное принятие транзакции - плохой выбор дизайна. В качестве аргумента рассмотрим вариант использования потока, который занят работой над длинной транзакцией и не реагирует на запрос завершения работы. Когда приложение в конечном итоге закрывает пул соединений, это, в свою очередь, закрывает соединение, фиксируя незавершенную транзакцию!

Мораль этой истории в том, что реализации пула соединений всегда должны вызывать rollback () перед закрытием соединения в режиме ручной фиксации. Однако это не то, что приходит на ум при реализации пула соединений. В качестве примера см. PooledConnectionImpl из DBCP

.
1 голос
/ 29 июля 2011

Из Javadoc Connection.close():

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

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