Транзакции не откатываются с HikariCP

Я использую 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

Ищу какие-то решения. Заранее спасибо.

Отправьте соответствующий код, если вам не удалось выполнить откат. Какой фреймворк вы используете. Вы вызываете метод внутри того же класса?

Mạnh Quyết Nguyễn 08.05.2018 14:59

Как думаете, что будет делать откат? Ни одна из отмеченных технологий не справляется с этим сама по себе. Вы используете JTA или другое управление транзакциями? Ты понимаешь что делаешь?

Kayaman 08.05.2018 15:02

@ MạnhQuyếtNguyễn: Я использую Spring framework. Я обновил вопрос кодом.

Abhishek Ramachandran 08.05.2018 15:13

Вы уже повторно выбросили исключение в своем предложении catch?

Mạnh Quyết Nguyễn 08.05.2018 15:19

@ MạnhQuyếtNguyễn: Нет проблем с кодом. Я только что привел образец кода. Так же нормально работает с org.apache.commons.dbcp.BasicDataSource

Abhishek Ramachandran 09.05.2018 05:32

Можете ли вы показать свою конфигурацию hikari и какую версию hikari вы используете?

user7294900 09.05.2018 07:15

@ user7294900: Я обновил свой вопрос конфигурацией hikari. Пожалуйста, взгляните на него

Abhishek Ramachandran 09.05.2018 07:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
7
3 034
2

Ответы 2

Как узнать, что транзакции откатываются по нет?

Если autoCommit=falseа также состояние транзакции грязное, HikariCP автоматически откатится на Connection.close(). Если ведение журнала отладки включено, вы должны увидеть его в журнале. Если вы не видите сообщение журнала, это означает, что Spring явно вызывает rollback() (или commit()) перед вызовом close() - как я и ожидал с аннотацией выше.

Как узнать, что транзакции не откатываются? - Записи вставляются в tblCompany, который является первым запросом в транзакции, даже после того, как исключение было выброшено из второго запроса. Итак, как Вы упомянули, rollback() вызывается до метода close(), а флаг useLocalTransactionState был true. Так что отката не происходит. Как только элемент управления достигает этого метода, для isCommitStateDirty устанавливается значение false. Так что даже если будет достигнут метод close(), отката там тоже не произойдет. .. Решение: установить useLocalTransactionState на false.
Abhishek Ramachandran 10.05.2018 12:11

Попробуйте установить 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.

hawe 29.01.2019 13:59

Другие вопросы по теме