transaction 관련 문의드립니다
- 작성자 :
- 전*아
- 작성일 :
- 2011-06-09 14:00:14
- 조회수 :
- 2,547
- 구분 :
- 실행환경
- 진행상태 :
- 완료
Q
안녕하세요~
트랜잭션 관련문의 드려요.
하나의 service class내에서 여러개의 메소드를 불러서 DB관련 처리를 하려고 합니다.
(혹은 또 다른 service class내의 메소드를 불러서 처리하려고 합니다)
아래와 같은 구조인데요
컨트롤러에서 부르는 메소드는 InsertMain(tbSrCodeVO) 이구요
insertMaster(tbSrCodeVO) 와 insertDetail(tbSrCodeVO) 모두 정상처리일때는 정상으로
둘중 하나 처리시 오류가 발생할경우 오류로 처리하여 DB도 모두 rollback 처리가 되는지 확인중입니다.
그런데
insertDetail(tbSrCodeVO) 메소드에 해당하는 transDAO.insertDetail(tbSrCodeVO); 처리시 항목의 값을 컬럼 자리수보다 크게하여 일부러 에러를 내보았는데요
insertMaster(tbSrCodeVO) 는 DB에 저장이 되어있고
insertDetail(tbSrCodeVO) 는 DB에 저장이 안되어있어요
제대로 트랜잭션 관리가 되었다면 둘다 저장이 안되어있어야 하는 상황입니다.
context-transaction.xml 파일의 <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/> 부분을 설정하면
"기존 Transaction이 있는 경우에는 기존 Transaction 내에서 실행하고, 기존 Transaction이 없는 경우에는 새로운 Transaction을 생성한다."
고 하여 설정한 상태입니다.
어떻게 하면 이런경우 트랜잭션관리를 할수 있을지 답변좀 부탁드릴께요
------------ TransServiceImpl.java -------------
package sr.com.trans.service;
......
@Service("transService")
public class TransServiceImpl extends AbstractServiceImpl implements TransService {
@Resource(name="transDAO")
private TransDAO transDAO;
public void InsertMain(TbSrCodeVO tbSrCodeVO) throws Exception {
insertMaster(tbSrCodeVO);
insertDetail(tbSrCodeVO);
}
public void insertMaster(TbSrCodeVO tbSrCodeVO) throws Exception {
transDAO.insertMaster(tbSrCodeVO);
}
public void insertDetail(TbSrCodeVO tbSrCodeVO) throws Exception {
transDAO.insertDetail(tbSrCodeVO);
}
}
------------ context-transaction.xml-------------
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx"
expression="execution(* egovframework.com..*Impl.*(..)) or
execution(* egovframework.rte.fdl.excel.impl.*Impl.*(..)) or
execution(* sr..*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
트랜잭션 관련문의 드려요.
하나의 service class내에서 여러개의 메소드를 불러서 DB관련 처리를 하려고 합니다.
(혹은 또 다른 service class내의 메소드를 불러서 처리하려고 합니다)
아래와 같은 구조인데요
컨트롤러에서 부르는 메소드는 InsertMain(tbSrCodeVO) 이구요
insertMaster(tbSrCodeVO) 와 insertDetail(tbSrCodeVO) 모두 정상처리일때는 정상으로
둘중 하나 처리시 오류가 발생할경우 오류로 처리하여 DB도 모두 rollback 처리가 되는지 확인중입니다.
그런데
insertDetail(tbSrCodeVO) 메소드에 해당하는 transDAO.insertDetail(tbSrCodeVO); 처리시 항목의 값을 컬럼 자리수보다 크게하여 일부러 에러를 내보았는데요
insertMaster(tbSrCodeVO) 는 DB에 저장이 되어있고
insertDetail(tbSrCodeVO) 는 DB에 저장이 안되어있어요
제대로 트랜잭션 관리가 되었다면 둘다 저장이 안되어있어야 하는 상황입니다.
context-transaction.xml 파일의 <tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/> 부분을 설정하면
"기존 Transaction이 있는 경우에는 기존 Transaction 내에서 실행하고, 기존 Transaction이 없는 경우에는 새로운 Transaction을 생성한다."
고 하여 설정한 상태입니다.
어떻게 하면 이런경우 트랜잭션관리를 할수 있을지 답변좀 부탁드릴께요
------------ TransServiceImpl.java -------------
package sr.com.trans.service;
......
@Service("transService")
public class TransServiceImpl extends AbstractServiceImpl implements TransService {
@Resource(name="transDAO")
private TransDAO transDAO;
public void InsertMain(TbSrCodeVO tbSrCodeVO) throws Exception {
insertMaster(tbSrCodeVO);
insertDetail(tbSrCodeVO);
}
public void insertMaster(TbSrCodeVO tbSrCodeVO) throws Exception {
transDAO.insertMaster(tbSrCodeVO);
}
public void insertDetail(TbSrCodeVO tbSrCodeVO) throws Exception {
transDAO.insertDetail(tbSrCodeVO);
}
}
------------ context-transaction.xml-------------
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="requiredTx"
expression="execution(* egovframework.com..*Impl.*(..)) or
execution(* egovframework.rte.fdl.excel.impl.*Impl.*(..)) or
execution(* sr..*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
A
안녕하세요.. 전영아님..
우선.. 설정하시는 transaction 처리는 정상적으로 구성하였습니다.
다만, <tx:method/>의 propagation 부분에는 "PROPAGATION_REQUIRED"와 같이 앞에 "PROPAGATION_" prefix를 주시면 되실 것 같습니다.
그럼.. 즐거운 하루되십시오.
감사합니다.
우선.. 설정하시는 transaction 처리는 정상적으로 구성하였습니다.
다만, <tx:method/>의 propagation 부분에는 "PROPAGATION_REQUIRED"와 같이 앞에 "PROPAGATION_" prefix를 주시면 되실 것 같습니다.
그럼.. 즐거운 하루되십시오.
감사합니다.