티스토리 뷰

Spring Batch를 실행할 때 ORA-08177: can't serialize access for this transaction (이 트랜잭션에 대한 직렬화 액세스를 할 수 없습니다) 오류가 발생하였다. 여러개의 Spring Batch Job이 하나의 JobRepository를 가지고 동시에 실행이 될 때 발생할 수 있는 문제이다. 이는 JobRepository 설정 중 transactionManager의 IsolationLevelForCreate 속성은 따로 지정하지 않을 경우 디폴트 값인 ISOLATION_SERIALIZABLE으로 설정되기 때문이다. 이를 ISOLATION_DEFAULT으로 변경하면 문제는 해결된다. 

 

변경을 하는 방법은 다음과 같다. 

Java Config

@Bean
public JobRepository jobRepository() throws Exception {
    JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
    factory.setDataSource(dataSource);
    factory.setTransactionManager(transactionManager());
    factory.setIsolationLevelForCreate("ISOLATION_DEFAULT");
    return factory.getObject();
}

 

Xml Config

<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"   
    p:dataSource-ref="batch.dataSource" 
    p:transactionManager-ref="transactionManager"   
    p:isolationLevelForCreate="ISOLATION_DEFAULT" />

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31