AOP를 이용한 트랜잭션 설정에서 트랜잭션 처리가 안되는 문제
- 작성자 :
- 강*주
- 작성일 :
- 2014-08-22 18:50:18
- 조회수 :
- 5,177
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
안녕하세요
전자정부 프레임워크 3.0 으로 개발중에 있습니다. DB는 altibase HDB 6.x 버전을 사용하고 있습니다.
AOP를 이용한 DB 트랜잭션 처리와 관련해서 기본적인 설정을 모두 마치고, 간단하게 테스트를 해보았습니다.
테스트는 altibase 와 oracle 에서 해보았는데 같은 결과가 나옵니다.
2개의 쿼리문을 실행하고 두번쨰에서 에러가 나도록 하였는데, 에러로그를 보면
<첫번째 쿼리문 실행 및 성공>
Creating a new SqlSession
Registering transaction synchronization for SqlSession
Releasing transactional SqlSession
Transaction synchronization committing SqlSession
Transaction synchronization deregistering SqlSession
Transaction synchronization closing SqlSession
<두번째 쿼리문 실행시 에러 발생>
Creating a new SqlSession
Releasing transactional SqlSession
Transaction synchronization deregistering SqlSession
Transaction synchronization closing SqlSession
이 처럼 하나의 메소드 내에서 실행한 두개의 쿼리문이 트랜잭션 처리가 되지 않고 있습니다.
관련 파일 첨부했습니다.
감사합니다.
전자정부 프레임워크 3.0 으로 개발중에 있습니다. DB는 altibase HDB 6.x 버전을 사용하고 있습니다.
AOP를 이용한 DB 트랜잭션 처리와 관련해서 기본적인 설정을 모두 마치고, 간단하게 테스트를 해보았습니다.
테스트는 altibase 와 oracle 에서 해보았는데 같은 결과가 나옵니다.
2개의 쿼리문을 실행하고 두번쨰에서 에러가 나도록 하였는데, 에러로그를 보면
<첫번째 쿼리문 실행 및 성공>
Creating a new SqlSession
Registering transaction synchronization for SqlSession
Releasing transactional SqlSession
Transaction synchronization committing SqlSession
Transaction synchronization deregistering SqlSession
Transaction synchronization closing SqlSession
<두번째 쿼리문 실행시 에러 발생>
Creating a new SqlSession
Releasing transactional SqlSession
Transaction synchronization deregistering SqlSession
Transaction synchronization closing SqlSession
이 처럼 하나의 메소드 내에서 실행한 두개의 쿼리문이 트랜잭션 처리가 되지 않고 있습니다.
관련 파일 첨부했습니다.
감사합니다.
첨부파일
A
안녕하세요. 강상주님.
Exception 상에 transaction 관련 interceptor 처리가 포함되어 있는 것으로 봐서는 transaction에 대한 처리가 진행된 것 같습니다.
그리고 개별 MyBatis 처리 마다 transaction 관련된 SqlSession이 commit되었다는 로그는 실제 commit된 것이 아니라 transaction manager에게 통제가 넘어간 것을 의미합니다.
즉, 로그상으로 transaction의 보장 여부를 판단하는 것이 아니라 DB 상에 실제 첫번째 update가 수행되었는지 확인이 필요합니다.
(혹시 이전 별도의 처리 떄문에 이미 update되어 있는 상황일 수 있음)
참조 : https://mybatis.github.io/spring/transactions.html 시작 부분 참조
다만, transaction 처리가 되는 경우 하나의 SqlSession만이 생성되어 사용되어야 하는데, 로그 상에는 2개의 개별 SqlSession이 생성된 것이 잘못된 것 같습니다.
혹시 첨부에 없는 sql-mapper-config.xml 설정 상에 자체 DataSource 및 Transaction 설정을 포함하고 있는지 확인 부탁드립니다.
그럼, 즐거운 하루되십시오.
감사합니다.
Exception 상에 transaction 관련 interceptor 처리가 포함되어 있는 것으로 봐서는 transaction에 대한 처리가 진행된 것 같습니다.
그리고 개별 MyBatis 처리 마다 transaction 관련된 SqlSession이 commit되었다는 로그는 실제 commit된 것이 아니라 transaction manager에게 통제가 넘어간 것을 의미합니다.
즉, 로그상으로 transaction의 보장 여부를 판단하는 것이 아니라 DB 상에 실제 첫번째 update가 수행되었는지 확인이 필요합니다.
(혹시 이전 별도의 처리 떄문에 이미 update되어 있는 상황일 수 있음)
참조 : https://mybatis.github.io/spring/transactions.html 시작 부분 참조
다만, transaction 처리가 되는 경우 하나의 SqlSession만이 생성되어 사용되어야 하는데, 로그 상에는 2개의 개별 SqlSession이 생성된 것이 잘못된 것 같습니다.
혹시 첨부에 없는 sql-mapper-config.xml 설정 상에 자체 DataSource 및 Transaction 설정을 포함하고 있는지 확인 부탁드립니다.
그럼, 즐거운 하루되십시오.
감사합니다.