아래까지 데이타소스 주입하는 것까진 완료가 되었는데 트랜잭션 설정에서
또 다시 막히고 있네요.
infrastructure-config.xml라는 부모 AC에
<tx:annotation-driven transaction-manager="JdbcTransactionManager"/>
라고 태그를 등록을 해놓고
DAO클래스 안에
Insert를 담당하는 메소드 한개를 만들었습니다.
@Transactional(readOnly=true,rollbackFor={SQLException.class})
public List<Object> saveBatch(xxx, xxx){
블라블라
}
이런식으로 해놨는데 readOnly를 true로 설정해놨으면
인서트를 하게 되면 롤백해야 되지 않나요?
그런데 아무 이상없이 데이터가 잘 입력되네요.
또 Web-logic과 같은 경우의 엔터프라이즈 WAS일 경우엔 JTA를 지원하고
글로벌 트랜잭션을 지원한다고 알고 있는데
<tx:jta-transaction-manager/>
이렇게 스프링에 명시적으로 트랜잭션에 관련한 매니져를 등록 안해줬을 경우에는
글로벌 트랜잭션 처리를 어떤 식으로 해주게 되는지 대해서 아시는 분 계신가요?
따로 지정 안해줬을 시엔 디폴트로 하게 되나요?
일단 지금 사용하시는 DataSource가 XA Datasource인지 확인해야하고... 만약
그렇다면 직접 JNDI lookup으로 Jta transaction manager를 얻어와서 프로그
램에서 트랜젝션 처리를 할 수는 있겠습니다. 하지만 그 datasource를 스프링
에 설정한 jdbc transaction manager에 주입해 놓은 상황이라면 transaction
처리에 충돌이 일어날 것 같은데요.
이런식으로 정의해놓았습니다.
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(*
base..service.*Service.*(..))" />
</aop:config>
<bean id="JdbcTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="oracleDataSource"/>
</bean>
<tx:annotation-driven transaction-manager="JdbcTransactionManager"/>
<tx:advice id="txAdvice" transaction-
manager="JdbcTransactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
이런식으로요. 전체적인 트랜잭션 윤곽은 이렇게 xml based aop로 설정해놓고
세부적인 것은 직접 @Transactional 어노테이션을 걸어놨는데요. 테스트를 해볼겸
제가 일부러 insert하는 메소드에 readonly를 걸어봤거든요.
설정이 무언가 잘못된건가요? 아니면 이와 관련된 lib가 부족한건가요;;;?
성철님 말씀대로라면 rollbackFor={SQLException.class})를
DataAccessException.class로 대체하면 롤백처리가 제대로 되겠군요?
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
"성철님 말씀대로라면 rollbackFor={SQLException.class})를
지금 트랜잭션 자체가 안 먹히는 것 같습니다.
@Transactional로 해도 안 먹고 xml에 포인트컷해서 해도 안 먹고..이상하네요;;
트랜잭션이 적용된 아주 심플한 예제가 어디 없을까요;;어디서부터 잘못된건지..
원격으로 설정 좀 봐주실 분 안계신가요? 다들 바쁘시려나;;
On 8월25일, 오후8시15분, Sanghyuk Jung <bene...@gmail.com> wrote:
> "성철님 말씀대로라면 rollbackFor={SQLException.class})를
> DataAccessException.class로 대체하면 롤백처리가 제대로 되겠군요? "
>
> 이 부분도 직접 해보시고 공유해 주시면 다른 분들께도 더욱 도움이 될 것 같네요~ ^^
>
> 2010년 8월 25일 오후 8:14, Sanghyuk Jung <bene...@gmail.com>님의 말:
>
>
>
> > 데이터 입력을 혹시 테스트 코드 안 에서 하셨나요? 트랜잭션이 REQUIRED로 되어 있으면 테스트 코드를 실행시키는
> > Transaction에 합류하게 되면서 그 전 트랜잭션의 속성을 타게되었는지도 모르겠네요.
>
> > 그리고 readonly 안에서 insert를 할 때 원래 스프링에서 던지는 Exception은 DataAccessException의
> > 하위 Exception인 TransientDataAccessException인데, 디폴트 설정이 runtime exception일때는
> > rollback이 되는 것으로 알고 있어서, 따로 Exception지정을 할 필요는 없지 않을까 합니다.
>
> > 2010년 8월 25일 오후 5:21, 미랭군 <devzer...@gmail.com>님의 말:
> >> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com<ksug%2Bunsu...@googlegroups.com>로
> >> 이메일을 보내주세요.
> >> 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.- 원본 텍스트 숨기기 -
>
> - 원본 텍스트 보기 -
<bean id="JdbcTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="oracleDataSource"/>
</bean>
<tx:annotation-driven transaction-manager="JdbcTransactionManager"/>
이렇게만 적용한 상태에서..
DAO에 이렇게 어노테이션을 걸어놓고..
@Transactional(readOnly=true)
public void saveCode(UserVo vo) {
블라블라
}
실행을 시켜봤는데도 에러 없이 입력이 잘되네여;;
> >> - 원본 텍스트 보기 -- 원본 텍스트 숨기기 -
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
BlackBerry® 에서 보냈습니다.
엄청난 리플들을 남겨주셔서 감사할 따름입니다.
빨리 이걸 해결하고 스프링 시큐리티를 적용해야하는데..;;
어쨌든 위에 질문들에 대해서 정리해봤습니다.
> saveCode()가 처음으로 트랜잭션이 걸리는 메소드인가요? 그러니까 @Transactional이 붙은 메소드 중에서 컨트롤러 등에서
> 최초로 호출되는 코드인가 하는 질문이에요.
saveCode()가 최초로 구동되는 메소드입니다.
> pointcut expression이 정확히 해당 DAO의 패키지 구조와 일치하는지? execution(* base..service.*Service.*(..))"
우선 패키지 구조와 AC구조입니다. http://blog.naver.com/zestun/60113818562
base 밑에 두개의 패키지가 있고 그 안에 service 그 안에 CommonService라는 클래스가 있습니다.
> expression에 포함된 Service란 녀석이 DAO인가요?
> 아니면 Service 따로 DAO따로 각각 스프링 빈으로 등록되어 있나요?
CommonService와 CommonDAO 각각 따로 스프링빈으로 등록되어있습니다.
> 혹시 트랜잭션 설정이랑 dao 빈이랑 같은 설정 파일에 등록되어있는지요
네 infrastructure-config.xml안에 등록되어있습니다.
> 근데 트랜잭션을 DAO에 거시는군요 보통 서비스에 걸던데 DAO에 거는 이유는 무엇인지 궁금합니다
별다른 이유는 없습니다. 그냥 기존 프로젝트가 DAO에 걸려있길래 저도 그냥 DAO에 걸어봤습니다 ㅠ
On 8월26일, 오전9시30분, whiteship2...@gmail.com wrote:
> 혹시 트랜잭션 설정이랑 dao 빈이랑 같은 설정 파일에 등록되어있는지요
>
> Ps: O.B님 질문은 좀 더 복잡한 경우를 추측하신듯 하네요 ㅋ
>
> Ps2: 근데 트랜잭션을 DAO에 거시는군요 보통 서비스에 걸던데 DAO에 거는 이유는 무엇인지 궁금합니다 --토스3 3장 참조
> BlackBerry(R) 에서 보냈습니다.
>
>
>
> -----Original Message-----
> From: One Bread <onebread....@gmail.com>
>
> Sender: ks...@googlegroups.com
> Date: Thu, 26 Aug 2010 06:25:46
> To: <ks...@googlegroups.com>
> Reply-To: ks...@googlegroups.com
> Subject: Re: AOP 트랜잭션 설정에 대해서..
>
> saveCode()가 처음으로 트랜잭션이 걸리는 메소드인가요? 그러니까 @Transactional이 붙은 메소드 중에서 컨트롤러 등에서
> 최초로 호출되는 코드인가 하는 질문이에요.
>
> 2010/8/26 미랭군 <devzer...@gmail.com>
> > <ksug%2Bunsu...@googlegroups.com<ksug%252Buns...@googlegroups.com>
> > >로
> > > >>>> 이메일을 보내주세요.
> > > >>>> 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.-
> > 원본 텍스트 숨기기 -
> > > >> - 원본 텍스트 보기 -- 원본 텍스트 숨기기 -
>
> > > - 원본 텍스트 보기 -
>
> > --
> > Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> > 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> > 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com<ksug%2Bunsu...@googlegroups.com>로
> > 이메일을 보내주세요.
> > 더 많은 옵션을 보려면http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
>
> --
> Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
살펴보니 저도 구원님 말씀대로
TransactionInterceptor.invoke(MethodInvocation) line: 106
이렇게 요놈이 딸려있네요.
On 8월26일, 오전10시54분, 미랭군 <devzer...@gmail.com> wrote:
> 드디어 토스3책이 도착했네요^^;; 흑 이메일을 확인해보니
>
> 엄청난 리플들을 남겨주셔서 감사할 따름입니다.
>
> 빨리 이걸 해결하고 스프링 시큐리티를 적용해야하는데..;;
>
> 어쨌든 위에 질문들에 대해서 정리해봤습니다.
>
> > saveCode()가 처음으로 트랜잭션이 걸리는 메소드인가요? 그러니까 @Transactional이 붙은 메소드 중에서 컨트롤러 등에서
> > 최초로 호출되는 코드인가 하는 질문이에요.
>
> saveCode()가 최초로 구동되는 메소드입니다.
>
> > pointcut expression이 정확히 해당 DAO의 패키지 구조와 일치하는지? execution(* base..service.*Service.*(..))"
>
> 우선 패키지 구조와 AC구조입니다.http://blog.naver.com/zestun/60113818562
> ...
>
> 추가 정보 >>- 원본 텍스트 숨기기 -
지금은 성철님 말씀대로 그냥 다 지운 상태에서 이 두개만 남겨놓은 상태입니다.
우선 @Transactional 어노테이션이 먹는지 테스트해보기 위해서요.
On 8월26일, 오전11시02분, Kuwon Kang <prever.k...@gmail.com> wrote:
> 그러면 해당 interceptor가 바로 Service에 딸린 놈이겠네요.
>
> 그럼 DAO메서드에 Annotation을 사용하려면 DAO도 역시 pointcut 대상이 되어야 할 것 같은데요?
>
> 2010/8/26 미랭군 <devzer...@gmail.com>
따로 pointcut을 지정해줘야하나요?
On 8월26일, 오전11시09분, Kuwon Kang <prever.k...@gmail.com> wrote:
> 설명을 하자면 ..
>
> Service에 tx pointcut이 등록이 되면 해당 Service Bean이 호출 될때 해당 메서드의 Annotation을 있는지
> 검사하고 이 어노테이션이 존재하면
> 그 속성을 가지고 Transaction을 생성하게 됩니다.
>
> 생성후에 실제 메서드를 호출하게 되죠.
>
> 그런데 DAO의 메서드에 annotation을 설정하게 되면 TranscationInterceptor가 동작하지 않게 되죠? 이유는
> pointcut 대상이 아니기 때문입니다.
>
> 따라서 DAO메서드에 선언된 Transactional Annotation은 무의미하게 된거죠.
>
> 스프링 트랜젝션이 생각보다 쉬어보이지만 실제 비즈니스 어플의 AOP와 Transaction AOP와 섞어놓고 보면 많이 헷갈리 수
> 있습니다.
>
> 이점을 고려하셔서 Transaction AOP와 Transactional Annotation을 사용하셔야 합니다.
>
> 2010/8/26 Kuwon Kang <prever.k...@gmail.com>
>
>
>
> > 그러면 해당 interceptor가 바로 Service에 딸린 놈이겠네요.
>
> > 그럼 DAO메서드에 Annotation을 사용하려면 DAO도 역시 pointcut 대상이 되어야 할 것 같은데요?
>
> > 2010/8/26 미랭군 <devzer...@gmail.com>
따로 pointcut을 지정해줘야하나요?
안되네요..뭐가 문제지;;
GIT나 구글코드를 써본적이 없어서 어떻게 하는지 모르겠습니다ㅠ
기선님 혹시 네이트온 사용하시는지요?
On 8월26일, 오후2시53분, Kuwon Kang <prever.k...@gmail.com> wrote:
> 제가 착각을 했네요.
>
> DAO클래스의 saveCode에 @Transactional을 주었기 때문에 pointcut이 없어도 동작을 하겠군요.
>
> 2010/8/26 <whiteship2...@gmail.com>
안되네요..뭐가 문제지;;
기선님 혹시 네이트온 사용하시는지요?
아이디를 찾을 수 없다고 나옵니다.
구글코드에 프로젝트 올려놨는데
http://reasonframework.googlecode.com/svn
Trunk:Reason_FrameWork
이렇게 만들어놓았습니다
On 8월26일, 오후4시00분, whiteship2...@gmail.com wrote:
> 예 지금은 커피숖이라 쫌이따 들어갈께요 ㅋㅋ 한 10분 후...
>
> whiteship2...@lycos.co.kr 추가해주세요
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
구글코드에 코드 등록해놨습니다.
https://reasonframework.googlecode.com/svn
Trunk명은 Reason_Framework
On 8월26일, 오후4시21분, 백기선 <whiteship2...@gmail.com> wrote:
> 미랭님 안들어 오시나요? 흠냐.. 대기 중입니다.
>
> 2010년 8월 26일 오후 4:00, <whiteship2...@gmail.com>님의 말:
>
>
>
> > 예 지금은 커피숖이라 쫌이따 들어갈께요 ㅋㅋ 한 10분 후...
>
> > whiteship2...@lycos.co.kr 추가해주세요
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
--
Jdbc 쪽 Log를 찍어보면 어떻게 나오는지 궁금합니다.
그렇다면 문제는 해결된 샘이네요. ;;;
오라클의 Jdbc driver는 대체 언제나 정상 작동하려는 건지...
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
재미있네요.
제가 방금 오라클에 문의 한 결과 Oracle JDBC Driver는 setReadOnly를 지원하지 않는다는 군요.ㅠㅠ
완전 삽질하게 했습니다.ㅠㅠ
그냥 지원 안한다고 JavaDoc에 넣어주면 얼마나 좋을 까...ㅠㅠ
2010/8/26 Sungchul Park <gyu...@gmail.com>
여러 자료를 이후에 검색해본 결과 JDBC Vendor에 따라 Connection을 구현 할 때 readyOnly=true이면 Exception을 내거나 하는 식으로 지원을 하는데 이는 Vendor의 구현에 따라 다르다고 하는군요.저도 이 부분이 의심스럽더군요.
결과 적으로 readOnly는 Vendor에 따라 다르다고 볼 수 있을 것 같습니다.
JdbcConnection의 readonly 기능이 구현안되었다면 exception이 안 일어나니까요.
그런데 어떤 DB를 사용하신 건가요?
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으) 로 이메일을 보내세요.
직접 쿼리를 날려서 설정했던 것일까요? ㅠㅠ
어쨌든 다들 저때문에 삽질하게 만들어서 죄송합니다ㅠ
이부분은 그냥 넘어가야겠네요..
지원을 하는지 알고 싶네여..
대부분이 오라클이지만 인포믹스를 쓰는 회사도 몇개 있어서..
혹시 인포믹스 사용하시는 분 없으신가여?
> > set transaction read only 명령을 썼던 걸 헛갈렸나봐요.;;- 원본 텍스트 숨기기 -
--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.