Как HikariCP обрабатывает неполные транзакции JDBC?
Вчера я наткнулся на HikariCP и провел всю ночь, изучая его. Я действительно впечатлен количеством деталей и усилий, поставленных в тонкой настройке его реализации и дизайна.
Прямо в точку, я не мог определить, как она на самом деле имеет дело с соединениями, которые проверяются обратно в пул с их autoCommit
, установленными на false
, в то время как на них не выдаются commit()
и rollback()
, например, из-за исключения. Это потенциально может стать источником многих серьезных транзакционных проблем для следующего реквестера, ожидающего нового соединения, но, к сожалению, получает это соединение со своим обвисшим состоянием транзакции.
В то время как у C3P0 и Tomcat JDBC-пула есть некоторые из этих так называемых Ручек для этой самой цели (через конфигурацию или перехват), я не смог найти ничего в документации или группе поддержки HikariCP. Пожалуйста, поправьте меня, если я ошибаюсь, но написание простого unit test показало мне, что пул ничего не делает по этому поводу.
Мне нужно знать, действительно ли это наблюдение правильно, и я ничего не пропустил. Кроме того, если есть какой-либо план для решения этой проблемы в HikariCP, так как это важно для меня.
Спасибо.
Ответы
Ответ 1
Я один из авторов HikariCP. HikariCP автоматически не выполняет фиксацию или откат, если автоматическая фиксация отключена. Обычно ожидается, что приложение, которое отключает автообъявление явно, готово должным образом обработать их (рекомендуется в блоке finally
) - как в в этом примере из официальной документации JDBC.
Мы готовы добавить автоматическое "откат" поведения в HikariCP (но не автоматическое "commit" ), если соединение возвращается в пул с автоматическим фиксацией в false. Пожалуйста, откройте запрос функции, если вы желаете этого поведения.
ОБНОВЛЕНИЕ: HikariCP 1.2.2 и выше выполняют автоматический "откат" для закрытых подключений с автоматическим фиксацией, установленным на "false". Кроме того, уровень изоляции транзакции будет reset для настроенного значения по умолчанию, и, как отмечено в комментариях ниже, конечно, закройте открытые сообщения и т.д.
UPDATE: HikariCP 2.3.x и выше теперь дополнительно отслеживают состояние транзакции, когда auto-commit установлен на false
, и будет обходить операцию автоматического отката, если состояние транзакции чиста.