Добрый день.
Готовлюсь к переезду на 5.2, просматриваю все скрипты на предмет изменения апи.
В одном из используемых костылей/сервлетов у меня используется конструкция вида
Код:
Connection con=setup.getDBConnectionFromPool();
try{...
}
catch(SQLException e){log(e);}
catch(Exception e){log(e);}
finally{
con.close();
}
Первое что пришло в голову - не закрывать соединение, а возвращать его в пул обратно, но Setup.returnConToPool(con) @Deprecated... Пишут использовать Utils#closeConnection. Поискал, есть метод ServerUtils.closeConnection(con) - но это опять же закрытие... Отсюда вопрос номер 1. Так все-таки закрывать соединение или возвращать в пул?
Вопрос номер два который всплыл во время просмотра этого класса ServerUtils... там есть метод commitConnection(con)... Зачем он? можно же con.commit() вызывать? там вроде никаких эксепшенов не бросается даже как при close(), так что нечего оборачивать в другие методы...
Ну и третий вопрос про innodb и плюхи транзакций... хочу использовать роллбэк при отловле ошибок, а то сейчас ошибка в середине скрипта - половина данных изменилась, половина нет, а тут можно было бы ошибку поймать - сделать роллбэк и все, но с транзакциями до этого не работал, отсюда вопросы. видимость изменений какая? допустим если я работаю в пределах метода с одним коннекшеном, то обращения через него будут видеть уже измененные данные? т.е. я делаю инсерт каких то данных, потом через этот же коненшн делаю выборку? Как я себе это представляю - внутри try работаем работаем, а потом finally commit... ну и catch ->rollback и все красиво =) Если нет, то это надо использовать сэйвпоинт в самом начале ставить и потом уже на него делать роллбэк
Вторая часть вопроса - при получении getDBConnectionFromPool - у этого соединения автокомит включен или надо его отрубать?
Заключительная часть вопроса. Соединение при получении его из пула блокируется и не доступно до момента возврата в пул? Не получится ли так что два потока будут иметь одно соединение и ролбэк в одном из потоков приведет к откату в другом?