交易不会被 HikariCP 回滚

Abh*_*hek 5 java mysql connection rollback hikaricp

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
}
} 
Run Code Online (Sandbox Code Playgroud)

这里,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
Run Code Online (Sandbox Code Playgroud)

寻找一些解决方案。提前致谢。

bre*_*ttw 1

您如何知道事务没有被回滚?

如果事务状态是脏的,autoCommit=false HikariCP将自动回滚Connection.close()。如果启用了调试日志记录,您应该会看到它被记录。如果您没有看到日志消息,则意味着 Spring在调用之前显式调用rollback()(或) —— 正如我对上面的注释所期望的那样。commit()close()