2012-10-08 3 views
1

이 메서드는 계층 구조를 호출하는 프로 시저 중 하나가 예외를 throw하면 이전 프로 시저 호출에서 변경된 내용을 롤백하지 못하는 것과 같은 몇 가지 문제점을 이해하지 못했습니다 .... 절차의 계층 구조를 호출하는 경우는 이전 프로 시저 호출에서 변경을 롤백하지 않습니다Java에서 다중 Oracle 저장 프로 시저 호출 및 데이터 일관성 유지

public synchronized boolean save(DTO dto) throws DAOException,IllegalArgumentException 
{   boolean retVal=false; 
      boolean retVal1=false; 
      boolean retVal2=false; 
      boolean retVal5=true; 
    try{ 
       connection=dataSource.getConnection(); 
       connection.setAutoCommit(false); 
       cstmt=connection.prepareCall("{call PKG_ALL.PROC_MAIN(?,?,?)}"); 

       cstmt.setString(1, "A");  cstmt.setString(2, "B"); 
       cstmt.registerOutParameter(3,Types.VARCHAR); 

       ResultSet rs=cstmt.executeQuery();     
       String ErrMsg=cstmt.getString(3); 
       if(ErrMsg.equalsIgnoreCase("Record Inserted")) retVal=true; 
       else retVal=false; 

     cstmt.close(); 

     cstmt1=connection.prepareCall("{call PKG_ALL.PROC_CHILD1(?,?,?)}"); 

       cstmt1.setString(1, "A");  cstmt1.setString(2, "B"); 
       cstmt1.registerOutParameter(3,Types.VARCHAR); 

       ResultSet rs1=cstmt.executeQuery();     
       String ErrMsg1=cstmt1.getString(3); 
       if(ErrMsg1.equalsIgnoreCase("Record Inserted")) retVal1=true; 
       else retVal1=false; 

     cstmt1.close(); 

     if(strSerialNo!=null && strSerialNo.length > 0) // for a non-mandatory multirow in the form 
     { 
      cstmt2=connection.prepareCall("{call PKG_ALL.PROC_CHILD2(?,?,?)}"); 
       for(int k=0;k<strSerialNo.length;k++) 
        { 
         cstmt2.setString(1,"M"); 
         cstmt2.setString(2,"I"); 
         cstmt2.registerOutParameter(3,Types.VARCHAR); 

         ResultSet rs2=cstmt2.executeQuery(); 
         String ErrMsg2=cstmt2.getString(3); 
         if(ErrMsg2.equalsIgnoreCase("Record Inserted")) retVal2=true; 
         else 
          { 
           retVal5=false; 
           retVal2=false; 
          }   
        } 
      cstmt2.close(); 
     } 

     **if(retVal&&retVal1&&retVal5)** 
       { 
        retVal=true; 
        connection.commit(); 
       } 
       else 
       { 
        //connection.rollback(); 
        retVal=false; 
       } 
    } 
    catch(SQLException e) 
      { 
       throw new DAOException(":"+e.getMessage()); 
      } 
      catch(Exception e) 
      { 
       throw new DAOException(":"+e.getMessage()); 

      } 
      finally 
      { 
       closeConnection(connection); 
      } 
      return retVal; 
} 

답변

1

밖으로 제발 도와주세요하면 예외를

년 OFC가 발생합니다, 당신 전화하지 마라. catch SQLException 블록에서 롤백 할 수 있습니다. 요청 중 하나가 예외를 throw하지 않고 작동하지 않는 경우에만 롤백 메소드를 호출합니다.

또한 요청을 실행 한 후에 절대로 변경을 수행하지 않으므로 connection.rollback();이라고하는 else 문을 사용하면 커밋 된 항목이 없으므로 롤백 할 필요가 없습니다.

this page에는 커밋/롤백 처리 방법에 대한 기본 예제가 있습니다.

+0

누락 된 코드는 무엇이 될지 알려주세요 .. @ alain.janinm – user1728387

+0

@ user1728387 connection.commit(); 각 쿼리 후. 그런 다음 catch 블록에서 connection.rollback()을 추가합니다. 그리고 당신은 당신의 상태를 제거 할 수 있습니다 (retVal && retVal1 && retVal5) –