首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事务没有得到HikariCP的回滚

事务没有得到HikariCP的回滚
EN

Stack Overflow用户
提问于 2018-05-08 12:57:43
回答 2查看 4.3K关注 0票数 6

我正在使用HikariCP作为连接池。我已经尝试将autoCommit设置为true和false。不过,当异常发生时,我的事务不会得到回滚。

我也对org.apache.commons.dbcp.BasicDataSource做过同样的尝试。事务正在正确地使用此数据源进行回滚,但在配置com.zaxxer.hikari.HikariDataSource时则不然。

我正在使用MySQL InnoDB数据库引擎。

编辑:

代码语言:javascript
复制
@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方法插入的记录没有回滚

代码语言:javascript
复制
<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

寻找一些解决办法。提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-05-09 12:24:09

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

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

票数 1
EN

Stack Overflow用户

发布于 2019-01-29 12:58:29

尝试将useLocalTransactionState设置为false,并查看它是否起作用。

注意:您的配置当前正在设置此属性两次!使用<prop key="useLocalTransactionState">true</prop>删除一条重复行,然后将剩下的一行更改为将属性设置为false而不是true

为什么我推荐这样做:我只是花了一天的时间试图找出为什么我的交易不会被回滚。我发现它连接到useLocalTransactionState属性。如果我将useLocalTransactionState设置为true,则不会回滚事务,尽管调试和p6spy清楚地显示回滚由事务管理器执行。

有一个MySQL连接器/J bug #75209描述类似的东西。尽管该bug声称是用MySQL Connector/J v5.1.40修复的,但我仍然可以看到v5.1.40和v8.0.13的类似行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50234214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档