본문 바로가기

old

TPC(Two Phase Commit) 이기종 데이터베이스 분산 트랜잭션 구현 (Java Atomikos)

tibero와 postgres를 한 트랜잭션으로 묶을 것이다.

 

1. dependency 추가 (자바 버전 1.7)

<!-- 분산트랜잭션STR -->
<dependency>
    <groupId>com.atomikos</groupId>
    <artifactId>transactions-jdbc</artifactId>
    <version>4.0.6</version>
</dependency>

<dependency>
     <groupId>javax.transaction</groupId>
     <artifactId>jta</artifactId>
     <version>1.1</version>
</dependency>
<!-- 분산트랜잭션END -->

 

2. bean 추가

<!-- atomikos -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
    init-method="init" destroy-method="close">
    <property name="forceShutdown">
        <value>true</value>
    </property>	
</bean>

<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
    <property name="transactionTimeout">
        <value>300</value>
    </property>	
</bean>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="atomikosTransactionManager"/>
    <property name="userTransaction" ref="atomikosUserTransaction"/>	
</bean>

[오류] class="com.atomikos.icatch........" 부분에서 오류 메시지가 뜬다면 dependency가 제대로 추가되지 않은 것.

Maven update, project clean, server clean, jar 파일 직접 삽입(비추함 한 dependency에 jar 파일이 많음) 등으로 재빌드를 시도해 볼 것.

 

 

3. 오류 메시지

expected single matching bean but found 2: transactionManager, txManager

[오류] 기존에 사용하던 tibero transaction(하단)과 충돌

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource-tibero"/>
</bean>

[해결]  @Transactional 어노테이션에 value={bean 이름} 옵션과 readOnly=true 옵션을 붙여줌

@Transactional(value = "transactionManager", readOnly = true)
public Integer insertTestData(Map<String, Object> param) throws Exception{
    //쿼리
    return 1;
}