잘 정리해보자

Spring Batch Error : TransientDataAccessResourceException : Batch Execution Errorsdetails;Cannot change the ExecutorType when there is an existing transaction 본문

Spring/Spring Boot

Spring Batch Error : TransientDataAccessResourceException : Batch Execution Errorsdetails;Cannot change the ExecutorType when there is an existing transaction

토마토오이 2022. 1. 19. 00:16

에러 메시지 :

TransientDataAccessResourceException : Batch Execution Errors details <Cannot change the ExecutorType when there is an existing transaction

 

 

발생 원인 :

batch execution(ExecutorType.BATCH)이 동작 중인데, 중간에 mapper(ExecutorType.SIMPLE)를 호출하면서 발생.

 

( AbstractPagingItemReader 진행 중에 mapper 호출해서 발생했다.

log를 남길 수 없는 환경에서 DB에 log insert하는 mapper를 호출하려다 트랜잭션에러 발생.)

 

 

 

해결 : 

pagingItemReader는 BATCH타입으로 실행중인데, mapper는 기본인 SIMPLE타입으로 호출해서 BATCH타입으로 session 맞추면 해결.

 

ExecutorType.BATCH 으로 트랜잭션 세션을 open하고 mapper 호출 완료 후 다시 close하는 방식으로 구현.

//log insert
private void insertLog(String desc) {
    SqlSession sqlsession = sqlSessionFactory.openSession(ExecutorType.BATCH);
    Map<String,Object> param = new HashMap<String,Object>();
    param.put("log", desc);
    try {
        sqlsession.insert(mapper.class.getName() +".insetLogDesc", param);
    }finally {
        sqlsession.flushStatements();
        sqlsession.close();
    }
}

 

 

 

 

 

Comments