질문입니다. IBatis + Spring Transaction

403 views
Skip to first unread message

김성우

unread,
Mar 7, 2011, 2:06:43 AM3/7/11
to ks...@googlegroups.com
안녕하세요..

Spring( 3.0.4.RELEASE) + IBatis( 2.5.6 ) 을 사용하고 있습니다. 

트랜잭션 관련하여 질문이 있는데요 아시는분 계시면 답변좀 부탁 드리겠습니다.

미리 감사의 말씀드립니다. 넙쭉.

현재 Spring의 Transaction을 사용하고 있습니다. Dao객체 관련하여 테스트케이스를

작성하던 도중에 이런 문제를 발견하였는데요, 테스트 메소드를 실행한후에 롤백이 잘

작동하는걸 목표로 작성하고 있었는데, 저희 회사가 프로시저를 많이 사용하고 있어서

모든 디비 호출이 SP기준으로 되어 있습니다. 

sp_user_add, sp_user_get 을 호출하여 유저 객체가 잘들어가는지 확인하고

롤백을 하는 간단한 코드입니다. 하지만 제대로 작동을 하지 않는 것이지요,

user_add는 잘되고 리턴값도 잘받으나 user_get을 하면 해당 데이터를 못가져오는 

것입니다. ( 아마도 두개의 트랜잭션이 분리되는 현상인거 같습니다. )

현재 까지 생각엔  문제가 발생한 부분은 모든것이 sp로 작성되어있고, sp안에서

새로운 트랜잭션을 선언하도록 되어있습니다. 이런경우에는 제대로 작동을

하지 않는지 궁금합니다. 이런문제 겪어보신분 계신가요?

디비는 Sqlserver 2005 를 사용하고 있습니다.

참고로 프로시저를 사용하지 않고 INSERT, SELECT로 처리할경우에는 트랜잭션 처리가

잘작동하고 롤백도 매우 잘작동 합니다. sp_user_add(sp) 후에 select를 이용하여도 잘되더군요,

하지만 연속으로 sp_user_add, sp_user_get을 호출하면 이런 문제가 발생합니다.

해당 트랜잭션은 모두 처음 생성된 테스트 트랜잭션에 참여할수 있도록 Propagation.REQUIED로

설정되어 있으며 트랜잭션 참여도 로그를 확인한결과 정상적으로 작동하였습니다.

아시는문 모쪼록 답변부탁드려요~

성우 김

unread,
Mar 7, 2011, 3:09:55 AM3/7/11
to Korea Spring User Group
DB팀에 권한을 열어달라고 요청하여 프로시저를 조회한결과, 프로시저 제일 앞단에....

if @@trancount > 0 begin
rollback tran
end

이라고 되어있네요.. 무슨이유인지 모르겠으나 이렇게 사용하거나 아시는분 설명좀 부탁드립니다..

트랜잭션이 중첩되어있을경우 무조건 롤백시키고 시작하는게 의미가 있는건가요?

DBA와 무슨이야기를 해야하는건지 잘모르겠습니다.

Sungchul Park

unread,
Mar 7, 2011, 3:28:40 AM3/7/11
to ks...@googlegroups.com
앞단의 작업을 무시하겠다는 것 같네요.
결국 이 프로시듀어만 트랜잭션 안에서 유일하게 작동되도록 하겠다는 결정으
로 보입니다.
즉 한 트랜잭션에서 두 프로시듀어를 실행하면 이 결정에 위배되겠습니다.

성우 김

unread,
Mar 7, 2011, 8:07:04 PM3/7/11
to Korea Spring User Group
네 답변감사합니다, 또 궁금한게 DB프로시저가 이런식으로 작업되는 경우가 일반적인가 궁금하네요,

앞에 작업했던 내용이 모두 롤백되버려서 Dao관련 테스트케이스 작성을 못하는 경우가 생기네요..

오늘 살펴보니 모든 제공되는 프로시저가 저코드를 탑재하고 있네요, 질문해보니,

orphaned transaction 문제 때문에 들어간 코드라고 하는데 일반적으로 쓰이는 코드인가 해서요,

DB쪽과 이야기해서 풀려면, 뭔가저도 잘알고 이야기를 시작해야 할것같아서요,

저렇게 사용하면 하나의 프로시저 안에서 트랜잭션 선언후 연달아 여러 프로시저 호출하면

이전 프로시저호출이 모두 롤백되지 않나요? ㅡ.ㅡ

Sewon Ann

unread,
Mar 7, 2011, 8:11:40 PM3/7/11
to ks...@googlegroups.com, 성우 김
조직의 프로시저 구성 정책을 먼저 살포시 물어보시는 게 어떨까요?
예를 들면 이런 저런 이유로 프로시저 내에서 프로시저 호출은 막는다, 트랜잭션 문제를 간소화하기 위해 모든 트랜젝션은 프로시저 단위로만 처리한다 등등..

조직 내에서 명확한  규칙을 정의하고, 잘 지켜지고 있다면 이를 준수해서 작업하는게 좋겠지요.

DB 분이 저렇게 말씀하신 걸 보면 아마도 그런 사내 규칙이 있을 법 한데요. 개발자랑 커뮤니케이션이 안된 부분이 있을진 모르겠지만요.

2011/3/8 성우 김 <leoi...@gmail.com>
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.


신승한

unread,
Mar 7, 2011, 8:16:04 PM3/7/11
to ks...@googlegroups.com

프로시저 위주로 개발이 진행되었다면, 이미 객체지향 개발과는 거리가 멀어졌을겁니다..
(한국식 SQL 지향 프로그래밍...)

dao관련 테스트는 포기하는게 좋을듯 하네요.


2011년 3월 8일 오전 10:11, Sewon Ann <kin...@gmail.com>님의 말:

김성우

unread,
Mar 8, 2011, 2:25:26 AM3/8/11
to ks...@googlegroups.com
답변 달아주셔서 감사합니다.

흐음. DB팀에서 프로시저 트랜잭션 사용하지 말라고 하네요,

DAO테스트는 일부 포기하고 맵핑여부만 테스트 할수 있도록 우회해야 겠습니다.

흠 눈앞에 dao를 모두 테스트 슈트로 묶을수 있었는데 좀 허무하기 그지 없습니다.

답변 주신분들 모두 감사드립니다. 

2011년 3월 8일 오전 10:16, 신승한 <my....@gmail.com>님의 말:
Reply all
Reply to author
Forward
0 new messages