Добавляя к другому ответу, я проверил поведение на Oracle и SQL Server, базах данных, с которыми я сейчас работаю.
MSSQL откатывает транзакцию. Это то, что вы ожидаете интуитивно.
Oracle с другой стороны, совершает транзакцию. Это задокументировано в их Руководстве по JDBC :
Если режим автоматической фиксации отключен и вы закрываете соединение без явной фиксации или отката последних изменений, выполняется неявная операция COMMIT.
Конечно, спецификация JDBC дает вам свободу в любом случае, но я лично считаю, что неявное принятие транзакции - плохой выбор дизайна. В качестве аргумента рассмотрим вариант использования потока, который занят работой над длинной транзакцией и не реагирует на запрос завершения работы. Когда приложение в конечном итоге закрывает пул соединений, это, в свою очередь, закрывает соединение, фиксируя незавершенную транзакцию!
Мораль этой истории в том, что реализации пула соединений всегда должны вызывать rollback () перед закрытием соединения в режиме ручной фиксации. Однако это не то, что приходит на ум при реализации пула соединений. В качестве примера см. PooledConnectionImpl из DBCP
.