我正在使用 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
正在寻找一些解决方案。提前谢谢。
2条答案
按热度按时间ezykj2lf1#
尝试设置
useLocalTransactionState
至false
看看有没有什么不同。注意:您的配置当前正在设置此属性两次!删除其中一个重复的行
<prop key="useLocalTransactionState">true</prop>
然后更改剩下的一个以将属性设置为false
而不是true
.推荐理由:我花了一天时间试图弄清楚为什么我的事务没有回滚。我发现它和
useLocalTransactionState
财产。如果我设置useLocalTransactionState
至true
我的事务不会回滚,尽管我的调试和测试清楚地表明回滚是由我的事务管理器执行的。mysql connector/jbug#75209也描述了类似的东西。尽管mysql connector/jv5.1.40修复了这个bug,但我仍然可以看到v5.1.40和v8.0.13的类似行为。
5vf7fwbs2#
您如何知道事务没有回滚?
如果
autoCommit=false
如果事务状态为dirty,hikaricp将自动回滚Connection.close()
. 如果启用了调试日志记录,则应该看到它已被记录。如果看不到日志消息,则表示spring正在显式调用rollback()
(或commit()
)打电话之前close()
--正如我对上面的注解所期望的那样。