Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

ChainedTransactionManager를 이용한 글로벌트랜잭션

OpenSource/Spring 2013.08.22 16:39
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 

 

ChainedTransactionManager는 정말 획기적인 것 같다.

2pc의 글로벌트랜잭션을 하기 위하여 XA datasource를 이용하던지, 분산처리를 할 수 있는 오픈소스를 사용하여야만 하였다.

하지만 stand alone 에서도 또는 tomact에서! 아주 쉽게 2pc 처리를 할 수 가 있다.
즉, 글로벌 트랜잭션으로 묶을 수 가있다.

 

환경 : spring 3.1

         tomcat 6.0

         maven project

 

 

 


 

 

 

 maven을 사용하고 있다면 아래의 jar파일을 우선적으로 가져와야한다.

 

# pom.xml 설정

 

dependencies에 아래와 같이 선언한다.

 

 <dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-neo4j-tx</artifactId>
  <version>2.1.0.RELEASE</version>
  <exclusions>
   <exclusion>
    <artifactId>cglib</artifactId>
    <groupId>cglib</groupId>
   </exclusion>
  </exclusions>
 </dependency>
 <dependency>
  <groupId>org.neo4j</groupId>
  <artifactId>neo4j-kernel</artifactId>
  <version>1.8</version>
 </dependency>

 

 

 


 

 

# 데이터소스 설정

  데이터소스는 dbcp로 설정!!

  
 <!-- DataSource from DBCP -->
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
       <property name="driverClassName" value="${database.driver.ClassName}" />
      <property name="url" value="${database.url}" />
      <property name="username" value="${database.username}" />
      <property name="password" value="${database.password}" />
 </bean>

 

<bean id="dataSource_remote" class="org.apache.commons.dbcp.BasicDataSource">

    블라~블라~
</bean>

 

 


 

 

# context 설정

 

 <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/> 

 -> proxy-target-class="true"는 class class 기반 일경우에 true~!!! Interface 기반이면 삭제 해도 무관하다 default가 false 이다!

 

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


 <bean id="transactionManagerAcetRemote"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource_remote" />
 </bean>

 

 <bean id="transactionManager"    <--- 대표가 되는 트랜잭션 manager~!
  class="org.springframework.data.neo4j.transaction.ChainedTransactionManager"
  lazy-init="false">
  <constructor-arg>
   <list>
    <ref bean="transactionManagerAcet" />
    <ref bean="transactionManagerAcetRemote" />
   </list>
  </constructor-arg>
 </bean>     

 

 

 


 


 괜찮은 것 같다.

 

  - 끝 -

'OpenSource > Spring' 카테고리의 다른 글

Spring WebFlux  (0) 2017.04.26
ChainedTransactionManager를 이용한 글로벌트랜잭션  (0) 2013.08.22
Bug  (0) 2013.06.21
@Vaild 처리 시 주의 할 사항!!  (0) 2013.06.21
Spring jmsTemplate 사용하기  (0) 2013.03.26
HornetQ, JMS Client using Springframework and Maven  (0) 2013.03.22

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

2PC, JTA 사용 시 데이터소스가 하나만 먹히는 문제

OpenSource/Spring MVC 2013.05.27 02:08
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

 [그리운 만슈니..ㅠㅠ]

 

아래의 설명은 위의 사진과는 무관합니다! ^-^

 

2PC, JTA 사용 시 데이터소스가 하나만 먹히는 문제

 

환경

was : jboss eap 5.1 - xa datasource 설정

springframework 3.1 - jta manager 사용

@MVC 기반 => Facade - Service - Dao - Mybatis

postgreSQL 9.2(local- windows ver)

postgreSQL 9.2(remote - windows ver)

mybatis 3.1.1

 

 


 

TEST

Facade(POJO) - Service(POJO) - Dao - Mybatis 이나

Facade - FacadeImpl - Service - Dao - Mybatis 구조로 테스트 함.

 

[Facade - FacadeImpl - Service - Dao - Mybatis 구조]

1) JDK 다이나믹 프록시 사용 & Class프록시 사용

결과 : FacadeImpl 즉, 구현클래스에 @Transactional 사용(롤백, Required_NEW 등 2PC 트랜잭션 잘됌)

      그러나 Class 프록시로 전환 뒤 Service에 @Transactional 해보았지만 트랜잭션 먹히지 않음.

      커뮤니티에 문의 한 결과..정확하게 말해주는 사람은 없었음. 그러나 순수 class까지도 되어야 한다고 함.

 

[Facade(POJO) - Service(POJO) - Dao - Mybatis구조]

2) Class 프록시 사용

결과 : JTA를 사용하였지만 데이터소스 하나만 잘됨. 2PC일 때 다른 데이터소스는 트랜잭션이 먹히지 않음. 단일 트랜잭션임에도 불구하고..

 

 


 

추측

1. PostgreSQL AutoCommit 문제

  

2013/05/25 - [DataBase/Postgresql] - windows postgreSQL autocommit off 만들기

 

2.XA Datasource는 조금 다른지..

http://forum.springsource.org/showthread.php?100710-JTA-on-JBoss-not-working&s=e077b42fd45ae3a3177a01c90339893c 참고

 

 


 

주저리

 

아..스프링 시큐리티도 해야하는데..완전 손놓고 있네..이노무 Global Transaction.....@.@;;

해결 되면 업데이트 하겠음!!~

 

 

 https://community.jboss.org/message/747830#747830

 

 


 

해결!!~

Mybatis에서 map 중복이 있어서 해당 datasource를 잘 찾지 못하거나 다른 db에 들어가는 현상이 있었다!!


라고 해결 한줄 알았으나!!  그게 아니였다!!

한 클래스내에서 메소드별로 @Transactional이라는 것으로 전파속성을 달리해서 사용한다면 예를 들어서 한 클래스내에 A라는 메소드에서B라는 메소드를 호출 시에 B에서 전파속성을 Reqired_new를 사용 할 경우에 트랜잭션이 타지 않는 현상이 있습니다.
이를 해결해주기 위해서는 메소드를 클래스로 하나 빼서 처리를 하면 됩니다. 이와 비슷한 경우는 @Asyne라는 어노테이션에서도 발생을 합니다.

 

- 끝 -

 

 

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바