java transactionTemplate不适用于mybatis,但我不知道为什么
我正在尝试使用transactionTemplate来管理我的事务。代码可能如下所示:
private Boolean isCleanSuccess(){
return transactionTemplate.execute(new TransactionCallback<Boolean>() {
@Override
public Boolean doInTransaction(TransactionStatus transactionStatus) {
String rmcName = "sync";
StringBuilder sbSync = new StringBuilder();
sbSync.append("delete from `t_sync_data_plan` WHERE 1=1");
StringBuilder sbRmc = new StringBuilder();
sbRmc.append("delete from `t_rmc_data` where `name`=\"")
.append(rmcName)
.append("\"");
try{
jdbcTemplate.execute(sbSync.toString());
jdbcTemplate.execute(sbRmc.toString());
/**
* throw the exception to make it rollback
*/
// throw new RuntimeException();
return true;
}catch (Exception ex){
LOG.error(ex);
transactionStatus.setRollbackOnly();
return false;
}
}
});
}
当我使用jdbcTemplate处理Dao时,它是有效的。然而,如果我在使用myBatis时抛出异常,它就无法回滚。XML代码如下所示:
<!-- rest transaction -->
<bean id="restTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="restDataSource"/>
</bean>
<bean id="restTransactionTemplate" name="restTransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="restTransactionManager"/>
</bean>
<!--domain transacation-->
<bean id="domainTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="domainDataSource"/>
</bean>
<bean id="domainTransactionTemplate" name="domainTransactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="domainTransactionManager"/>
</property>
</bean>
<!-- multi-datasource config -->
<bean id="multipleDataSource" class="com.angho.rest.db.MultipleDataSource" init-method="init">
<property name="defaultTargetDataSource" ref="restDataSource"/>
<property name="targetDataSources">
<map>
<entry key="restDataSource" value-ref="restDataSource"/>
<entry key="domainDataSource" value-ref="domainDataSource"/>
</map>
</property>
<property name="baseDaoDir" value="com.angho.rest"/>
<property name="dataSourceNameMap">
<map>
<entry key="dao" value="restDataSource"/>
<entry key="dao2" value="domainDataSource"/>
</map>
</property>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="multipleDataSource" />
<property name="configLocation" value="classpath:/mybatis-config.xml"/>
</bean>
我不知道为什么回滚只在jdbcTemplate下有效,但在mybatis下会失效。表的引擎是InnoDB。 你能帮我一下吗?这让我困惑了将近两周。 很抱歉,我的英语不好给您带来了不便
# 1 楼答案
试试这样:
这样你就可以简单地使用@Transacional
更多信息: http://www.mybatis.org/spring/