2012-10-08 25 views
1

此方法有一些我不明白的问题,例如,如果任何过程调用层次结构时引发异常,它不会回滚以前过程调用中所做的更改....请帮我在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块中回滚。如果您的某个请求不起作用而您没有抛出异常,则只调用回滚方法。

另外你在执行你的请求之后从不提交更改,所以当你来到else语句,你调用connection.rollback();时,实际上没有任何东西可以回滚,因为没有任何提交。

阅读this page有一个如何处理提交/回滚的基本示例。

+0

请告诉我缺少的代码会是什么样子.. @ alain.janinm – user1728387

+0

@ user1728387您可以使用connection.commit();在每个查询之后。然后在catch块中添加connection.rollback();如果(retVal && retVal1 && retVal5)可以摆脱您的状况 –

相关问题