@transactional 사용시 return
- 작성자 :
- 구*서
- 작성일 :
- 2015-12-09 15:15:26
- 조회수 :
- 1,194
- 구분 :
- 개발환경
- 진행상태 :
- 완료
Q
@Transactional(propagation = Propagation.REQUIRED,rollbackFor={Exception.class})
method에서 트랜잭션을 사용시 Exception 걸렸을때 리턴값을 model(ModelMap) 로 리턴 가능한가요?
@Transactional(propagation = Propagation.REQUIRED,rollbackFor={Exception.class})
@RequestMapping(value = "/pd/order/insertOrder.do")
public String insertOrder(@ModelAttribute("ordManageVO") PdOrderManageVO ordManageVO, ModelMap model, HttpServletRequest request) {
user = (LoginVO)request.getSession().getAttribute("loginVO");
ordManageVO.setInCharge(user.getId());
HwvnCommonLib lib = new HwvnCommonLib();
List<PdOrderManageVO> list = null;
POIUploadUtil poiutil = new POIUploadUtil();
PdOrderManageVO pdor = null;
String error = "";
int cnt = 0;
int i = 0;
list = (List<PdOrderManageVO>) poiutil.uploadOrder(ordManageVO.getFileName());
if("0000".equals(list.get(0).getResponseCode())){
for(i=0;i<list.size();i++){
pdor = list.get(i);
pdor.setUnikey(pdor.getOriginCom2()+pdor.getStyleNo()+pdor.getOrderNo());
cnt = lib.getDelChkOrder(pdor.getOriginCom2()+pdor.getStyleNo()+pdor.getOrderNo());
if(cnt > 0){
pdOrderService.deleteOrderDetail_mirror(pdor);
pdOrderService.deleteOrderDetail(pdor);
pdOrderService.deleteOrderList(pdor);
}
pdor.setInCharge(user.getId());
pdOrderService.insertOrderDetail_mirror(pdor);
}
pdor.setResponseCode("0000");
pdor.setResponseMessage(Integer.toString(list.size()));
model.addAttribute("result",pdor);
}else{
pdor.setResponseCode("9999");
pdor.setResponseMessage(list.get(0).getResponseMessage());
model.addAttribute("result",pdor);
}
return "egovframework/hwvn/pd/order/PdOrderInsertDesc";
}
이메소드에서 트랜잭션을 걸었는데 롤백도 잘되고 잘돌아갑니다
허나 insert를 세개의 테이블에 하고 있는데 몇번째 줄에서 걸린건지 걸렸으면 리턴값을 던질소 있는지
참고로 jquery로 던저서 리턴값을 받는데 try{}catch를 걸어 받을수는 있으나 그럼 롤백이 안먹히고 throw new Exception 으로 던지면 리턴값을 원하는 방식으로 받기가 어렵습니다. 원하는 방식으로 리턴값을 받을 수는 없나여?
method에서 트랜잭션을 사용시 Exception 걸렸을때 리턴값을 model(ModelMap) 로 리턴 가능한가요?
@Transactional(propagation = Propagation.REQUIRED,rollbackFor={Exception.class})
@RequestMapping(value = "/pd/order/insertOrder.do")
public String insertOrder(@ModelAttribute("ordManageVO") PdOrderManageVO ordManageVO, ModelMap model, HttpServletRequest request) {
user = (LoginVO)request.getSession().getAttribute("loginVO");
ordManageVO.setInCharge(user.getId());
HwvnCommonLib lib = new HwvnCommonLib();
List<PdOrderManageVO> list = null;
POIUploadUtil poiutil = new POIUploadUtil();
PdOrderManageVO pdor = null;
String error = "";
int cnt = 0;
int i = 0;
list = (List<PdOrderManageVO>) poiutil.uploadOrder(ordManageVO.getFileName());
if("0000".equals(list.get(0).getResponseCode())){
for(i=0;i<list.size();i++){
pdor = list.get(i);
pdor.setUnikey(pdor.getOriginCom2()+pdor.getStyleNo()+pdor.getOrderNo());
cnt = lib.getDelChkOrder(pdor.getOriginCom2()+pdor.getStyleNo()+pdor.getOrderNo());
if(cnt > 0){
pdOrderService.deleteOrderDetail_mirror(pdor);
pdOrderService.deleteOrderDetail(pdor);
pdOrderService.deleteOrderList(pdor);
}
pdor.setInCharge(user.getId());
pdOrderService.insertOrderDetail_mirror(pdor);
}
pdor.setResponseCode("0000");
pdor.setResponseMessage(Integer.toString(list.size()));
model.addAttribute("result",pdor);
}else{
pdor.setResponseCode("9999");
pdor.setResponseMessage(list.get(0).getResponseMessage());
model.addAttribute("result",pdor);
}
return "egovframework/hwvn/pd/order/PdOrderInsertDesc";
}
이메소드에서 트랜잭션을 걸었는데 롤백도 잘되고 잘돌아갑니다
허나 insert를 세개의 테이블에 하고 있는데 몇번째 줄에서 걸린건지 걸렸으면 리턴값을 던질소 있는지
참고로 jquery로 던저서 리턴값을 받는데 try{}catch를 걸어 받을수는 있으나 그럼 롤백이 안먹히고 throw new Exception 으로 던지면 리턴값을 원하는 방식으로 받기가 어렵습니다. 원하는 방식으로 리턴값을 받을 수는 없나여?
A
구강서님, 안녕하세요.
로직 중간에 익셉션이 발생하는 경우의 후처리를 말씀하시는 것 같습니다.
이 경우 트랜잭션을 수동으로 컨트롤 하도록 설정하시면 되지 않을까 생각됩니다.
익셉션 발생시 throw new Exception 하신 후, 컨트롤러에서 try catch문을 이용해 처리한 후, catch문에 rollback을 수행하도록 작업하시면 될 것 같습니다.
아래 링크를 참고하여 작업해 보시기 바랍니다.
http://devyongsik.tistory.com/590
아울러, 트랜잭션 설정의 경우 컨트롤러가 아닌 서비스 단에 설정하시는 것을 권장하고 있습니다.
그 외에, 업무 로직에 대해 센터 측에서 분석을 할 수 없기 때문에, 가이드에는 어느정도 한계가 있는 점 양해 바랍니다.
감사합니다.
로직 중간에 익셉션이 발생하는 경우의 후처리를 말씀하시는 것 같습니다.
이 경우 트랜잭션을 수동으로 컨트롤 하도록 설정하시면 되지 않을까 생각됩니다.
익셉션 발생시 throw new Exception 하신 후, 컨트롤러에서 try catch문을 이용해 처리한 후, catch문에 rollback을 수행하도록 작업하시면 될 것 같습니다.
아래 링크를 참고하여 작업해 보시기 바랍니다.
http://devyongsik.tistory.com/590
아울러, 트랜잭션 설정의 경우 컨트롤러가 아닌 서비스 단에 설정하시는 것을 권장하고 있습니다.
그 외에, 업무 로직에 대해 센터 측에서 분석을 할 수 없기 때문에, 가이드에는 어느정도 한계가 있는 점 양해 바랍니다.
감사합니다.