spring-boot MyBatisBatchItemWriter当存在现有事务时,无法更改ExecutorType

时间:2016-05-09 11:22:42

标签: spring-boot

我使用spring boot和mybatis MyBatisBatchItemWriter。 使用demo将数据写入数据库(mysql)时没问题。 但在我的项目中使用 org.springframework.dao.TransientDataAccessResourceException: Cannot change the ExecutorType when there is an existing transaction at org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:91) ~[mybatis-spring-1.2.2.jar:1.2.2] at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:353) ~[mybatis-spring-1.2.2.jar:1.2.2] at com.sun.proxy.$Proxy45.update(Unknown Source) ~[na:na]

这是我的演示:

 @Bean
public MyBatisBatchItemWriter<Hfbank> writer() {
    MyBatisBatchItemWriter<Hfbank> writer = new MyBatisBatchItemWriter<Hfbank>();
    writer.setSqlSessionFactory(sqlSessionFactory);
    String statementId = "com.springboot.dao.HfbankDao.insertSelective";
    writer.setStatementId(statementId);
    CompositeItemWriter compositeItemWriter  = new CompositeItemWriter();
     List delegates = new ArrayList();
     delegates.add(writer);
     compositeItemWriter.setDelegates(delegates);
     writer.setAssertUpdates(false);
    return writer;
}

这是我的MyBatisBatchItemWriter:

@Bean
 @StepScope
public MyBatisBatchItemWriter<ChannelDataInfo> writer(@Value("#{jobParameters[channelid]}")  Long channelid) {
    MyBatisBatchItemWriter<ChannelDataInfo> writer = new MyBatisBatchItemWriter<ChannelDataInfo>();
    SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);

    writer.setSqlSessionFactory(sqlSessionFactory);
    String statementId = "com.kaigejava.fundcheck.repository.ChannelDataInfoRepository.insertSelective";

    writer.setStatementId(statementId);
    CompositeItemWriter compositeItemWriter  = new CompositeItemWriter();
     List delegates = new ArrayList();
     delegates.add(writer);
     compositeItemWriter.setDelegates(delegates);
     writer.setAssertUpdates(false);
    return writer;
}

为什么演示正常,但我的项目有错误?

1 个答案:

答案 0 :(得分:1)

因为它是这样的:你不能改变交易中的执行者类型。

您似乎已经尝试批量编写某些内容作为包含其他SQL操作的更广泛的事务的一部分,但该事务是使用SIMPLE(默认)或REUSE执行器类型启动的。

很明显,批量写入需要BATCH执行器类型,但是一旦事务开始,它的执行器类型就无法更改。因此,如果您的RDBMS允许,请在单独的事务中执行批处理操作,或运行嵌套事务。