В чем разница в поведении в случаях если я устанавливаю hibernate.connection.autocommit true или false?
И почему включать эту функцию не рекомендуется?
hibernate.connection.autocommit=true
идентично JDBC команде: Connection.setAutoCommit(true);
Означает, что каждое SQL выражение рассматривается как отдельная транзакция и после выполнения выражения автоматически закрывается транзакция вызовом commit() - то есть подтверждением, что транзакция завершилась.
Это удобно и применяется только для простых операций. Для более сложных операций автокоммит может приводить к катастрофе.
Простой пример: допустим вы делаете перевод денег с одного счета на другой - это 2 операции - списание денег с одного счета и зачисление денег на другой счет. В ситуации с автокоммитом - вы списываете деньги с одного счета и подтверждаете транзакцию, далее зачисляете деньги на второй счет и опять подтверждаете транзакцию - вроде все отлично. Однако, если в момент между снятием денег с одного счета и зачислением денег на второй счет допустим падает коннекшн или рушится сервер, то после восстановления - вы получите что денежки пропали - со счета списались, но никуда не зачислились, а деньги эт всегда серьезно.
В правильной системе вы должны делать так:
commit())В таком случае, ни падение коннекта, ни обрушение сервера, ни что-то еще другое не сможет привести к фатальным последствиям.
Более подробно, например здесь
Продвижение своими сайтами как стратегия роста и независимости