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;
}
누락 된 코드는 무엇이 될지 알려주세요 .. @ alain.janinm – user1728387
@ user1728387 connection.commit(); 각 쿼리 후. 그런 다음 catch 블록에서 connection.rollback()을 추가합니다. 그리고 당신은 당신의 상태를 제거 할 수 있습니다 (retVal && retVal1 && retVal5) –