하나의 메소드에서 2개의 트렌젝션 매니져 사용시 롤백 가능 문의 드립니다.

753 views
Skip to first unread message

Jeonghwan Cheon

unread,
Jul 4, 2014, 4:55:52 AM7/4/14
to ks...@googlegroups.com
안녕하세요..

현재 2개의 트렌젝션 매니져는 각각 다른 DB를 보는 상태입니다. 
스키마 구조도 완전 다른 DB이구요..

이때 다름이 아니라 1개의 서비스 메소드의 2개의 트렌젝션 매니져를 사용하려고 하는데요..
1개의 서비스 메소드에서 예의 발생시 2개의 트랜젝션 매니져에서 롤백을 수행하려고 하는데..

@Transactional 어노테이션은 사용이 어려울거 같아 대신 다른 방법을 써야 할거 같기도 해서..
어떤식으로 사용하면 될지 문의 드립니다.

감사합니다. :)



전형민

unread,
Jul 4, 2014, 5:10:40 AM7/4/14
to ks...@googlegroups.com
이런경우 분산 transction 을 사용해야 하는 것으로 알고 있습니다.

상용 was 의 경우 이런 서비스를 해주는 것들도 있구요..

저는. 

http://www.atomikos.com/ 요거 사용합니다.

-- 구현하게 되면.
결국은 transction manager 는 하나이고...
transactionManager.commit();
할때 2개의 db에 동시에 commit 되죠.

물론.. 2 phase commit 을 사용하여. 두 db에 모두 commit 이 되었을때 완벽히 
commit 이 이루어 지는 구조 이죠..

--- 결론은.
프로그램을 수정하는 것이 아니라...

framework 에서 해결해 주는 거죠 ^^

도움이 되었기를. 바랍니다. 





------------------------------------
당신의 과거가 당신을 만든다.


2014년 7월 4일 오후 5:55, Jeonghwan Cheon <josuae...@gmail.com>님이 작성:

--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/ed1f2a36-66f7-4eca-ac90-c856e8f7fabf%40googlegroups.com을(를) 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.

KwonNam Son

unread,
Jul 4, 2014, 5:11:01 AM7/4/14
to ks...@googlegroups.com
Spring Data에서는 ChainedTransactionManager라는 것을 제공해주어 이를 해결해줍니다.
논리는 단순합니다. 이 하나의 트랜잭션 매니저로 다른 여러개의 트랜잭션 매니서즐 묶고, @Transactional에서 chainedTransactionManager만 처리하게 합니다.
그러면 이 녀석은 자기가 품고있는 트랜잭션 매니저들을 순차로 begin 하고 끝날때 다 같이 commit 혹은 rollback을 일괄적으로 시켜줍니다.

http://docs.spring.io/spring-data/commons/docs/1.6.2.RELEASE/api/org/springframework/data/transaction/ChainedTransactionManager.html

JTA 같은 완벽한 transaction 동기화는 아니므로 트랜잭션 2개중 하나는 commit 성공하고 하나는 성공 못하고 롤백하는 일도 발생할 수 있습니다만..
대부분의 경우 이것 만으로도 충분 할 것으로 보입니다.



2014년 7월 4일 오후 5:55, Jeonghwan Cheon <josuae...@gmail.com>님이 작성:
안녕하세요..

--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug에서 이 그룹을 방문하세요.
웹에서 이 토론을 보려면 https://groups.google.com/d/msgid/ksug/ed1f2a36-66f7-4eca-ac90-c856e8f7fabf%40googlegroups.com을(를) 방문하세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.



--
* 까먹지말자! http://kwon37xi.egloos.com

Jaeyong Kim

unread,
Jul 4, 2014, 5:11:08 AM7/4/14
to ks...@googlegroups.com

분산 트랜젝션을 쓰시면, 다른 디비간에도 설정만 손보면 기존 소스 건드리지 않고 수정이 가능합니다.
기존에 @Transactional 어노테이션을 쓰셨다면 그대로 놔두셔도 됩니다.

분산 트랜젝션 적용은 WAS 를 사용하시면 WAS 에 맞게 설정하거나
톰캣처럼 지원하지 않는 웹 컨테이너를 사용하신다면 


를 참조하시거나 atomikos 를 검색하시면 도움이 될 것같네요. 




2014년 7월 4일 오후 5:55, Jeonghwan Cheon <josuae...@gmail.com>님이 작성:
안녕하세요..

Jeonghwan Cheon

unread,
Jul 6, 2014, 9:15:27 PM7/6/14
to ks...@googlegroups.com
안녕하세요,

우선 권남님의 ChainedTransactionManager를 써보기로 하였습니다. :)
좋은 답변 주신 분들 감사합니다 :) 

2014년 7월 4일 금요일 오후 5시 55분 52초 UTC+9, Jeonghwan Cheon 님의 말:

KwonNam Son

unread,
Jul 6, 2014, 10:00:07 PM7/6/14
to ks...@googlegroups.com
정확한 테스트를 해본 것은 아니지만 ChainedTransactionManager를 사용할 때는 거기 참여하는 DataSource의 max connection 갯수를 동일하게 맞춰주십시오.
사실 멀쩡히 잘 실행될 수 있는 것인데 어느 한 쪽의 커넥션 갯수가 부족해서 timeout 오류가 발생할 가능성이 있어보입니다.

이 문제는 공식적으로 제기 된 것은 아니고 제 생각에 그런 일이 발생할 것으로 예상된다는 점입니다.

이는 작동 원리상 이런 현상이 발생하는게 당연해 보입니다.


2014년 7월 7일 오전 10:15, Jeonghwan Cheon <josuae...@gmail.com>님이 작성:

--
이 메일은 Google 그룹스 'Korea Spring User Group Q&A' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 ksug+uns...@googlegroups.com에 이메일을 보내세요.
http://groups.google.com/group/ksug에서 이 그룹을 방문하세요.

더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.
Reply all
Reply to author
Forward
0 new messages