Я использую HikariCP для пула соединений. Я попытался установить для autoCommit как истину, так и ложь. Все еще мои транзакции не поступают
откатывается при возникновении исключения.
Я пробовал то же самое с org.apache.commons.dbcp.BasicDataSource. Транзакции откатываются правильно с этим источником данных, но
не когда настроен com.zaxxer.hikari.HikariDataSource.
Я использую ядро базы данных MySQL InnoDB.
Редактировать:
@Service
@Transactional(rollbackFor = { Exception.class })
public class AServiceImpl {
@Override
public SomeDTO signUpUser(SomeDTO someDTO) throws Exception {
Company company = addCompany();
User user = addUser();
------------
}
private Company addCompany()
try{
return companyRepository.addCompany();
} catch(PersistenceException e){
//throws exception
}
}
@Override
public User addUser()
try{
return userRepository.addUser();
}catch(PersistenceException e){
//throws exception
}
}
Здесь исключение возникает в методе addUser, и записи, вставленные с помощью метода addCompany, не откатываются.
<bean id = "hikariConfig" class = "com.zaxxer.hikari.HikariConfig">
<property name = "driverClassName" value = "com.mysql.jdbc.Driver"/>
<property name = "jdbcUrl" value = "${jdbc.url}"/>
<property name = "username" value = "${jdbc.username}" />
<property name = "password" value = "${jdbc.password}" />
<property name = "maximumPoolSize" value = "100" />
<property name = "idleTimeout" value = "900000" />
<property name = "connectionTimeout" value = "2000" />
<property name = "minimumIdle" value = "20" />
<property name = "maxLifetime" value = "1800000" />
<property name = "leakDetectionThreshold" value = "60000" />
<property name = "autoCommit" value = "false" />
<property name = "dataSourceProperties">
<props>
<prop key = "prepStmtCacheSize">300</prop>
<prop key = "prepStmtCacheSqlLimit">2048</prop>
<prop key = "cachePrepStmts">true</prop>
<prop key = "useServerPrepStmts">true</prop>
<prop key = "useLocalSessionState">true</prop>
<prop key = "useLocalTransactionState">true</prop>
<prop key = "rewriteBatchedStatements">true</prop>
<prop key = "cacheResultSetMetadata">true</prop>
<prop key = "cacheServerConfiguration">true</prop>
<prop key = "elideSetAutoCommits">false</prop>
<prop key = "maintainTimeStats">true</prop>
<prop key = "useLocalTransactionState">true</prop>
</props>
</property>
</bean>
<bean id = "dataSource" class = "com.zaxxer.hikari.HikariDataSource"
destroy-method = "close">
<constructor-arg ref = "hikariConfig" />
</bean>
HikariCP version: 3.1.0
JDK version : 1.8.0_162
Database : MySQL InnoDB
MySQLJDBCDriver version : 5.1.31
Ищу какие-то решения. Заранее спасибо.
Как думаете, что будет делать откат? Ни одна из отмеченных технологий не справляется с этим сама по себе. Вы используете JTA или другое управление транзакциями? Ты понимаешь что делаешь?
@ MạnhQuyếtNguyễn: Я использую Spring framework. Я обновил вопрос кодом.
Вы уже повторно выбросили исключение в своем предложении catch?
@ MạnhQuyếtNguyễn: Нет проблем с кодом. Я только что привел образец кода. Так же нормально работает с org.apache.commons.dbcp.BasicDataSource
Можете ли вы показать свою конфигурацию hikari и какую версию hikari вы используете?
@ user7294900: Я обновил свой вопрос конфигурацией hikari. Пожалуйста, взгляните на него




Как узнать, что транзакции откатываются по нет?
Если autoCommit=falseа также состояние транзакции грязное, HikariCP автоматически откатится на Connection.close(). Если ведение журнала отладки включено, вы должны увидеть его в журнале. Если вы не видите сообщение журнала, это означает, что Spring явно вызывает rollback() (или commit()) перед вызовом close() - как я и ожидал с аннотацией выше.
rollback() вызывается до метода close(), а флаг useLocalTransactionState был true. Так что отката не происходит. Как только элемент управления достигает этого метода, для isCommitStateDirty устанавливается значение false. Так что даже если будет достигнут метод close(), отката там тоже не произойдет. .. Решение: установить useLocalTransactionState на false.
Попробуйте установить useLocalTransactionState на false и посмотрите, имеет ли это значение.
Внимание: ваша конфигурация в настоящее время устанавливает это свойство дважды! Удалите одну из повторяющихся строк с <prop key = "useLocalTransactionState">true</prop>, а затем измените оставшуюся, чтобы установить для свойства false вместо true.
Почему я рекомендую это: я просто потратил день, пытаясь выяснить, почему мои транзакции не откатываются. Я выяснил, что это связано со свойством useLocalTransactionState. Если я устанавливаю useLocalTransactionState на true, мои транзакции не откатываются, хотя моя отладка и p6spy ясно показывают, что откат выполняется моим менеджером транзакций.
Есть ошибка MySQL Connector / J # 75209, которая описывает нечто подобное. Хотя эта ошибка утверждается, что исправлена с помощью MySQL Connector / J v5.1.40, я все еще могу наблюдать аналогичное поведение для версий v5.1.40 и v8.0.13.
В вашем случае это может быть из-за # 75209, поскольку вы используете v5.1.31.
Отправьте соответствующий код, если вам не удалось выполнить откат. Какой фреймворк вы используете. Вы вызываете метод внутри того же класса?