Exception 및 transaction 관련 문의
- 작성자 :
- 진*대
- 작성일 :
- 2014-10-14 11:46:14
- 조회수 :
- 1,398
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
안녕하세요.
회사 운영환경에서 Exception 발생 케이스가 있어 두가지 질의드립니다.
1. Jeus, 전자정부프레임워크 환경에서 발생한 Exception 입니다.
ibatis batchupdate 시 SqlMapClient.startTransaction() 호출시 아래와 같은 Exception이 발생되었는데 발생원인이 궁금합니다.
---------- Exception 내용 ----------
com.ibatis.common.jdbc.exception.NestedSQLException: Could not start transaction. Cause: com.ibatis.sqlmap.engine.transaction.TransactionException: TransactionManager could not start a new transaction. A transaction is already started.
---------------------------------------
datasource는 Jeus JDBC connection pool 사용중이며, DB는 Altibase 입니다.
2. ibatis batchupdate를 사용하여, 2개의 DB 서버에 update를 순차적으로 할 경우,
첫번째 batchupdate는 성공하고, 두번째 batchupdate시 오류가 발생할 경우,
첫번째 성공한 update 내용까지 rollback이 되는것인지 궁금합니다.
참고로, 소스코드와 context-transaction.xml의 내용을 간략히 첨부하였습니다. 참고하시고 답변 부탁드립니다.
감사합니다.
회사 운영환경에서 Exception 발생 케이스가 있어 두가지 질의드립니다.
1. Jeus, 전자정부프레임워크 환경에서 발생한 Exception 입니다.
ibatis batchupdate 시 SqlMapClient.startTransaction() 호출시 아래와 같은 Exception이 발생되었는데 발생원인이 궁금합니다.
---------- Exception 내용 ----------
com.ibatis.common.jdbc.exception.NestedSQLException: Could not start transaction. Cause: com.ibatis.sqlmap.engine.transaction.TransactionException: TransactionManager could not start a new transaction. A transaction is already started.
---------------------------------------
datasource는 Jeus JDBC connection pool 사용중이며, DB는 Altibase 입니다.
2. ibatis batchupdate를 사용하여, 2개의 DB 서버에 update를 순차적으로 할 경우,
첫번째 batchupdate는 성공하고, 두번째 batchupdate시 오류가 발생할 경우,
첫번째 성공한 update 내용까지 rollback이 되는것인지 궁금합니다.
참고로, 소스코드와 context-transaction.xml의 내용을 간략히 첨부하였습니다. 참고하시고 답변 부탁드립니다.
감사합니다.
A
안녕하세요.
1. 2개의 DB서버에서 처리되는 작업을 함께 트랜잭션으로 처리하시려면,
DtaSourceTransactionManager가 아니라 JtaTransactionManager를 사용하셔야 합니다.
Spring JtaTransactionManager 매뉴얼을 참고해보십시오.
2. 기본적으로 두번째 작업 시 예외가 발생할 경우 첫번째 작업까지 롤백하시려면,
두 개의 메서드를 하나의 트랜잭션으로 구성하시고
각 메서드의 propagation 속성을 Required로 지정하시면 됩니다.
현재 소스코드에서는 첫번째 메서드에 대한 트랜잭션과 두번째 메서드에 대한 트랜잭션이 독립적으로 동작할 수 밖에 없습니다.
명시적으로 startTransaction()과 commitTransaction()을 통해 트랜잭션을 분리하고 있기 때문입니다.
이미 첫번째 update 후에 commit하고 있기 때문에
두번째 작업 중 예외 발생에 상관없이 무조건 첫번째 작업은 commit 됩니다.
감사합니다.
1. 2개의 DB서버에서 처리되는 작업을 함께 트랜잭션으로 처리하시려면,
DtaSourceTransactionManager가 아니라 JtaTransactionManager를 사용하셔야 합니다.
Spring JtaTransactionManager 매뉴얼을 참고해보십시오.
2. 기본적으로 두번째 작업 시 예외가 발생할 경우 첫번째 작업까지 롤백하시려면,
두 개의 메서드를 하나의 트랜잭션으로 구성하시고
각 메서드의 propagation 속성을 Required로 지정하시면 됩니다.
현재 소스코드에서는 첫번째 메서드에 대한 트랜잭션과 두번째 메서드에 대한 트랜잭션이 독립적으로 동작할 수 밖에 없습니다.
명시적으로 startTransaction()과 commitTransaction()을 통해 트랜잭션을 분리하고 있기 때문입니다.
이미 첫번째 update 후에 commit하고 있기 때문에
두번째 작업 중 예외 발생에 상관없이 무조건 첫번째 작업은 commit 됩니다.
감사합니다.