트랜잭션 문제
- 작성자 :
- 문*호
- 작성일 :
- 2010-10-12 16:02:40
- 조회수 :
- 3,828
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
안녕하세요 이번에 프로젝트 진행중 트랜잭션 설정을 하면서 정상적으로 작동하지 않게 돼서 질문드립니다.
트랜잭션 설정은
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
이렇게 돼있고 호출하는 serviceImpl 에서는
@Transactional
@Service("adNoticeService")
public class AdNoticeServiceImpl implements AdNoticeService{
......
@SuppressWarnings("unchecked")
public void insertAdNoticeBoard(Tmboardcontent boardcontent,
HttpServletRequest request) throws Exception {
// TODO Auto-generated method stub
MultipartHttpServletRequest mptRequest = (MultipartHttpServletRequest)request;
logger.info("\n===========insertAdNoticeBoard Start ================");
tmboardcontentDao.insertAdBoardContent(boardcontent);
.....
이런식으로 되 있습니다
첨부하신 파일을 보시면 아시겠지만 datasource 에서 defaultAutoCommit="false" 부분을 삭제하면 DB에 commit 되서 들어가는데 트랜잭션이 정상적으로 작동하지 않는건지.. 잘모르겠습니다. 살펴보시고 답변부탁드립니다.
트랜잭션 설정은
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
이렇게 돼있고 호출하는 serviceImpl 에서는
@Transactional
@Service("adNoticeService")
public class AdNoticeServiceImpl implements AdNoticeService{
......
@SuppressWarnings("unchecked")
public void insertAdNoticeBoard(Tmboardcontent boardcontent,
HttpServletRequest request) throws Exception {
// TODO Auto-generated method stub
MultipartHttpServletRequest mptRequest = (MultipartHttpServletRequest)request;
logger.info("\n===========insertAdNoticeBoard Start ================");
tmboardcontentDao.insertAdBoardContent(boardcontent);
.....
이런식으로 되 있습니다
첨부하신 파일을 보시면 아시겠지만 datasource 에서 defaultAutoCommit="false" 부분을 삭제하면 DB에 commit 되서 들어가는데 트랜잭션이 정상적으로 작동하지 않는건지.. 잘모르겠습니다. 살펴보시고 답변부탁드립니다.
A
안녕하세요.. 문재호님..
이 경우 TransactionManager, iBatis, DBCP 3곳에서 commit/rollback 처리가 가능합니다. (JDBC Driver 부분도 가능)
추가적으로 각각이 setAutoCommit을 통해 autoCommit을 따로 관리하는 로직들이 들어가는데.. 이 로직이 생각보다 복잡하게 동작합니다.
예를 들면.. Connection의 autoCommit 상태에 따라서 강제로 setAutoCommit을 통해 설정을 변경 하는 등의 처리가 있습니다.
(세부적인 부분들은 각 소스를 참조하시면 될 것 같습니다.)
그러나.. 일반적은 Spring의 TransactionManager(@Transactional 사용 등)를 사용하는 경우.. 다른 설정들은 기본값(defaultautoCommit=true)으로 하시면..
TransactionManager만이 commit/rollback을 수행하도록 되어 있습니다.
문재호님의 경우 DBCP의 defaultAutoCommit="false"를 제외시키시면 될 것 같습니다.
참고로 등록되는 데이터가 처리 중에 보이시더라고 transaction 처리에 이상이 있는 것은 아닙니다.
이 경우 여러 건 등록되는 첨부파일쪽에 임의로 오류를 발생시켜 보시고.. 처리된 데이터를 확인해 보시면 될 것 같습니다.
그럼.. 즐거운 하루되십시오.
감사합니다.
이 경우 TransactionManager, iBatis, DBCP 3곳에서 commit/rollback 처리가 가능합니다. (JDBC Driver 부분도 가능)
추가적으로 각각이 setAutoCommit을 통해 autoCommit을 따로 관리하는 로직들이 들어가는데.. 이 로직이 생각보다 복잡하게 동작합니다.
예를 들면.. Connection의 autoCommit 상태에 따라서 강제로 setAutoCommit을 통해 설정을 변경 하는 등의 처리가 있습니다.
(세부적인 부분들은 각 소스를 참조하시면 될 것 같습니다.)
그러나.. 일반적은 Spring의 TransactionManager(@Transactional 사용 등)를 사용하는 경우.. 다른 설정들은 기본값(defaultautoCommit=true)으로 하시면..
TransactionManager만이 commit/rollback을 수행하도록 되어 있습니다.
문재호님의 경우 DBCP의 defaultAutoCommit="false"를 제외시키시면 될 것 같습니다.
참고로 등록되는 데이터가 처리 중에 보이시더라고 transaction 처리에 이상이 있는 것은 아닙니다.
이 경우 여러 건 등록되는 첨부파일쪽에 임의로 오류를 발생시켜 보시고.. 처리된 데이터를 확인해 보시면 될 것 같습니다.
그럼.. 즐거운 하루되십시오.
감사합니다.