java事务没有使用hikaricp回滚

mzaanser  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(640)

我正在使用 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

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

ezykj2lf

ezykj2lf1#

尝试设置 useLocalTransactionStatefalse 看看有没有什么不同。
注意:您的配置当前正在设置此属性两次!删除其中一个重复的行 <prop key="useLocalTransactionState">true</prop> 然后更改剩下的一个以将属性设置为 false 而不是 true .
推荐理由:我花了一天时间试图弄清楚为什么我的事务没有回滚。我发现它和 useLocalTransactionState 财产。如果我设置 useLocalTransactionStatetrue 我的事务不会回滚,尽管我的调试和测试清楚地表明回滚是由我的事务管理器执行的。
mysql connector/jbug#75209也描述了类似的东西。尽管mysql connector/jv5.1.40修复了这个bug,但我仍然可以看到v5.1.40和v8.0.13的类似行为。

5vf7fwbs

5vf7fwbs2#

您如何知道事务没有回滚?
如果 autoCommit=false 如果事务状态为dirty,hikaricp将自动回滚 Connection.close() . 如果启用了调试日志记录,则应该看到它已被记录。如果看不到日志消息,则表示spring正在显式调用 rollback() (或 commit() )打电话之前 close() --正如我对上面的注解所期望的那样。

相关问题