Транзакции не откатываются с HikariCP - PullRequest
0 голосов
/ 08 мая 2018

Я использую HikariCP для пула соединений. Я попытался установить autoCommit на true и false. Все еще мои транзакции не получают откатывается при возникновении исключения.

Я пробовал то же самое с 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

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

Ответы [ 2 ]

0 голосов
/ 29 января 2019

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

0 голосов
/ 09 мая 2018

Откуда вы знаете, что транзакции не откатываются?

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

...