Transaction 관리 질문입니다.
- 작성자 :
- 문*술
- 작성일 :
- 2013-11-28 11:15:14
- 조회수 :
- 759
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
안녕하세요. 전자정부프레임워크를 이용하여 프로젝트 진행중입니다. 저희는 포탈서비스와 일부기능을 웹서비스로 제공하려고 하고있습니다.
웹서비스를 구현하다가 롤백을 하고 실패결과를 리턴해야 하는 경우가 발생해야 했는데요. 이런경우 exception 을 throw 하자니
저희쪽 웹서비스를 호출한 곳에 실패 결과가 전달이 되지않아 답답한 마음에 질문을 드립니다.
저희쪽 소스는
public returnVO callAPI(reqMap map) {
//내부 db 처리
insert1();
insert2();
update1();
// 외부연계모듈 호출
rslt = client.call();
// rslt 가 성공이면
if(rslt) {
return returnVO; // 처리결과 건수 등이 담긴 returnVO 반환 Soap
} else {
// 이부분이 문제입니다.
// DB는 롤백을 해야하고 저희쪽 웹서비스를 호출한 쪽에는 실패되었다는 returnVO; 를 리턴해야 하는데요....
throw new Exception("실패!!!");
}
}
이런 경우 어떻게 처리해야 될까요 exception 을 던지니까 롤백은 잘되지만 저희쪽 호출한 모듈에서도
실패결과가 아닌 exception 이 발생해 버리게됩니다.
예전같은 경우에는
if(rslt) {
con.commit();
return returnVO; // 처리결과 건수 등이 담긴 returnVO 반환 Soap
} else {
con.rollback();
// 실패처리
return returnVO;
}
이런식으로 처리가 되었을텐데요.
빠른 답변 부탁드립니다.
감사합니다.
웹서비스를 구현하다가 롤백을 하고 실패결과를 리턴해야 하는 경우가 발생해야 했는데요. 이런경우 exception 을 throw 하자니
저희쪽 웹서비스를 호출한 곳에 실패 결과가 전달이 되지않아 답답한 마음에 질문을 드립니다.
저희쪽 소스는
public returnVO callAPI(reqMap map) {
//내부 db 처리
insert1();
insert2();
update1();
// 외부연계모듈 호출
rslt = client.call();
// rslt 가 성공이면
if(rslt) {
return returnVO; // 처리결과 건수 등이 담긴 returnVO 반환 Soap
} else {
// 이부분이 문제입니다.
// DB는 롤백을 해야하고 저희쪽 웹서비스를 호출한 쪽에는 실패되었다는 returnVO; 를 리턴해야 하는데요....
throw new Exception("실패!!!");
}
}
이런 경우 어떻게 처리해야 될까요 exception 을 던지니까 롤백은 잘되지만 저희쪽 호출한 모듈에서도
실패결과가 아닌 exception 이 발생해 버리게됩니다.
예전같은 경우에는
if(rslt) {
con.commit();
return returnVO; // 처리결과 건수 등이 담긴 returnVO 반환 Soap
} else {
con.rollback();
// 실패처리
return returnVO;
}
이런식으로 처리가 되었을텐데요.
빠른 답변 부탁드립니다.
감사합니다.
A
안녕하세요. 문상술님.
이런 경우는 내부 db 처리 부분을 별도의 서비스로 분리하시고,해당 서비스부터 transaction을 처리하시면 됩니다.
callAPI 메소드 부분은 Controller에서 호출을 하면서 새롭게 추가한 서비스 부분에 대하여 try catch로 처리하시면 됩니다.
서비스 부분에서 exception이 throw되었기 때문에 transaction 설정에 따라 이미 rollback을 처리가 된 상태이기 때문에 transaction은 처리됩니다.
다만, 위 설명은 service 부분 호출에 transaction이 지정되고, callAPI 메소드 호출 부분은 transaction으로 지정되어 있지 않은 경우만 해당이 됩니다.
(일반적으로 Controller 부분은 transaction이 지정되지 않고 Service(Impl) 부분부터 지정)
그럼, 즐거운 하루되십시오.
감사합니다.
이런 경우는 내부 db 처리 부분을 별도의 서비스로 분리하시고,해당 서비스부터 transaction을 처리하시면 됩니다.
callAPI 메소드 부분은 Controller에서 호출을 하면서 새롭게 추가한 서비스 부분에 대하여 try catch로 처리하시면 됩니다.
서비스 부분에서 exception이 throw되었기 때문에 transaction 설정에 따라 이미 rollback을 처리가 된 상태이기 때문에 transaction은 처리됩니다.
다만, 위 설명은 service 부분 호출에 transaction이 지정되고, callAPI 메소드 호출 부분은 transaction으로 지정되어 있지 않은 경우만 해당이 됩니다.
(일반적으로 Controller 부분은 transaction이 지정되지 않고 Service(Impl) 부분부터 지정)
그럼, 즐거운 하루되십시오.
감사합니다.