我正在使用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寻找一些解决办法。提前谢谢。
发布于 2018-05-09 12:24:09
您如何知道事务没有被回滚?
如果autoCommit=false和事务状态是脏的,则在Connection.close()上使用HikariCP将自动回滚。如果启用了调试日志记录,则应查看它的日志记录。如果您没有看到日志消息,这意味着Spring在调用rollback() (或commit())之前显式地调用close() --正如我在上面的注释中所期望的那样。
发布于 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的类似行为。
https://stackoverflow.com/questions/50234214
复制相似问题