Q&A

  • 오라클에서 여러사용자가 동시에 커밋할때.


오라클 8.0 에 여러사용자가 동시에 접속해서 데이타 추가/수정/삭제/저장 등의



작업을 빈번하게 사용하는 프로그램을 개발중에 있습니다..



근데 두명의 사용자가 동시에 프로그램 사용중 한사람이 저장을 하면 다른 사용자가



저장버튼을 눌러도 프로그램이 동작하지 않고 SQL모래시계만 계속 보이고 한참 후에야



동작을 한다고 하는군여..



물론 저장 버튼 클릭시에 commit을 해주었구요..



혹시 모를까봐 한사람이 데이타 저장한후에 refresh까지 했습니다..



그런데도 그런 문제가 계속 발생을 하는것 같습니다.. 오라클에 접속해서 여러사용자



가 입출력 작업을 할때 Database 컴포넌트에 특별한 옵션을 주어야 하는건지..



이럴땐 어떻게 처리를 해야하는건지 정말 난감합니다..



유저 측에서 아주 난리를 칩니다.. 제발 도와주세여...



참고로 오라클이 탑재되어있는 PC사양은 NT서버에 메모리 128메가 펜3-500으로



알고있습니다.. 서버가 너무 딸려서 그러는것은 아닌지요?



참고로 아래의 소스는 저장버튼 클릭시에 코딩입니다



일련번호가 프라이머리키도 되어있고, 아무래도 다른쪽에서 일련번호 딴것을



다른 유저가 똑같은 일련번호를 따와서 그런것 같습니다..



그래서 일련번호의 최대값도 저장시에 따오도록 했는데.. 쩝



다른 유저가 저장한 일련번호를 읽어오지 못하는것 같습니다..



if MessageDlg('자료를 저장하시겠습니까? ',mtConfirmation, [mbYes, mbNo], 0) = mrYes then

begin

try

DM.Sales.StartTransaction;

if TableMode = 'InsertMode' then

begin

GetMaxOrders(0,MaxNo);

DM.TOrders.Edit;

DM.TOrders.FieldByName('ID').AsString := MaxNo;

DM.TOrders.Post;

end;



DM.Sales.Commit;

except

On E:Exception do begin

if pos('Key violation', E.Message) > 0 then

ShowMessage('키값이 중복되었습니다.!')

else if pos('Update failed', E.Message) > 0 then

ShowMessage('저장에 실패하였습니다.!')

else

ShowMessage(E.Message+'로 인하여 데이타베이스를 최종저장하기 전상태로 환원합니다');

DM.Sales.Rollback;

end;

end;

end;

DM.tOrders.Refresh;



3  COMMENTS
  • Profile
    김종섭 2001.05.23 20:24
    오라클은 잘 모르지만 일련번호를 오라클 자체에서 생성하게끔 하는것이 어떨런지요









    이석현 wrote:

    >

    > 오라클 8.0 에 여러사용자가 동시에 접속해서 데이타 추가/수정/삭제/저장 등의

    >

    > 작업을 빈번하게 사용하는 프로그램을 개발중에 있습니다..

    >

    > 근데 두명의 사용자가 동시에 프로그램 사용중 한사람이 저장을 하면 다른 사용자가

    >

    > 저장버튼을 눌러도 프로그램이 동작하지 않고 SQL모래시계만 계속 보이고 한참 후에야

    >

    > 동작을 한다고 하는군여..

    >

    > 물론 저장 버튼 클릭시에 commit을 해주었구요..

    >

    > 혹시 모를까봐 한사람이 데이타 저장한후에 refresh까지 했습니다..

    >

    > 그런데도 그런 문제가 계속 발생을 하는것 같습니다.. 오라클에 접속해서 여러사용자

    >

    > 가 입출력 작업을 할때 Database 컴포넌트에 특별한 옵션을 주어야 하는건지..

    >

    > 이럴땐 어떻게 처리를 해야하는건지 정말 난감합니다..

    >

    > 유저 측에서 아주 난리를 칩니다.. 제발 도와주세여...

    >

    > 참고로 오라클이 탑재되어있는 PC사양은 NT서버에 메모리 128메가 펜3-500으로

    >

    > 알고있습니다.. 서버가 너무 딸려서 그러는것은 아닌지요?

    >

    > 참고로 아래의 소스는 저장버튼 클릭시에 코딩입니다

    >

    > 일련번호가 프라이머리키도 되어있고, 아무래도 다른쪽에서 일련번호 딴것을

    >

    > 다른 유저가 똑같은 일련번호를 따와서 그런것 같습니다..

    >

    > 그래서 일련번호의 최대값도 저장시에 따오도록 했는데.. 쩝

    >

    > 다른 유저가 저장한 일련번호를 읽어오지 못하는것 같습니다..

    >

    > if MessageDlg('자료를 저장하시겠습니까? ',mtConfirmation, [mbYes, mbNo], 0) = mrYes then

    > begin

    > try

    > DM.Sales.StartTransaction;

    > if TableMode = 'InsertMode' then

    > begin

    > GetMaxOrders(0,MaxNo);

    > DM.TOrders.Edit;

    > DM.TOrders.FieldByName('ID').AsString := MaxNo;

    > DM.TOrders.Post;

    > end;

    >

    > DM.Sales.Commit;

    > except

    > On E:Exception do begin

    > if pos('Key violation', E.Message) > 0 then

    > ShowMessage('키값이 중복되었습니다.!')

    > else if pos('Update failed', E.Message) > 0 then

    > ShowMessage('저장에 실패하였습니다.!')

    > else

    > ShowMessage(E.Message+'로 인하여 데이타베이스를 최종저장하기 전상태로 환원합니다');

    > DM.Sales.Rollback;

    > end;

    > end;

    > end;

    > DM.tOrders.Refresh;

    >

  • Profile
    최혜룡 2001.05.19 04:20
    일련번호를 구하는 부분이 어찌 되어있는지 궁금하군요

    아마 그게 문제일것 같은데....

    혹, Loop되는건 아닌지..안보고는 힘드네요

    그리고 InsertMode인데 Edit하는 이유가 궁금하네요



    이석현 wrote:

    >

    > 오라클 8.0 에 여러사용자가 동시에 접속해서 데이타 추가/수정/삭제/저장 등의

    >

    > 작업을 빈번하게 사용하는 프로그램을 개발중에 있습니다..

    >

    > 근데 두명의 사용자가 동시에 프로그램 사용중 한사람이 저장을 하면 다른 사용자가

    >

    > 저장버튼을 눌러도 프로그램이 동작하지 않고 SQL모래시계만 계속 보이고 한참 후에야

    >

    > 동작을 한다고 하는군여..

    >

    > 물론 저장 버튼 클릭시에 commit을 해주었구요..

    >

    > 혹시 모를까봐 한사람이 데이타 저장한후에 refresh까지 했습니다..

    >

    > 그런데도 그런 문제가 계속 발생을 하는것 같습니다.. 오라클에 접속해서 여러사용자

    >

    > 가 입출력 작업을 할때 Database 컴포넌트에 특별한 옵션을 주어야 하는건지..

    >

    > 이럴땐 어떻게 처리를 해야하는건지 정말 난감합니다..

    >

    > 유저 측에서 아주 난리를 칩니다.. 제발 도와주세여...

    >

    > 참고로 오라클이 탑재되어있는 PC사양은 NT서버에 메모리 128메가 펜3-500으로

    >

    > 알고있습니다.. 서버가 너무 딸려서 그러는것은 아닌지요?

    >

    > 참고로 아래의 소스는 저장버튼 클릭시에 코딩입니다

    >

    > 일련번호가 프라이머리키도 되어있고, 아무래도 다른쪽에서 일련번호 딴것을

    >

    > 다른 유저가 똑같은 일련번호를 따와서 그런것 같습니다..

    >

    > 그래서 일련번호의 최대값도 저장시에 따오도록 했는데.. 쩝

    >

    > 다른 유저가 저장한 일련번호를 읽어오지 못하는것 같습니다..

    >

    > if MessageDlg('자료를 저장하시겠습니까? ',mtConfirmation, [mbYes, mbNo], 0) = mrYes then

    > begin

    > try

    > DM.Sales.StartTransaction;

    > if TableMode = 'InsertMode' then

    > begin

    > GetMaxOrders(0,MaxNo);

    > DM.TOrders.Edit;

    > DM.TOrders.FieldByName('ID').AsString := MaxNo;

    > DM.TOrders.Post;

    > end;

    >

    > DM.Sales.Commit;

    > except

    > On E:Exception do begin

    > if pos('Key violation', E.Message) > 0 then

    > ShowMessage('키값이 중복되었습니다.!')

    > else if pos('Update failed', E.Message) > 0 then

    > ShowMessage('저장에 실패하였습니다.!')

    > else

    > ShowMessage(E.Message+'로 인하여 데이타베이스를 최종저장하기 전상태로 환원합니다');

    > DM.Sales.Rollback;

    > end;

    > end;

    > end;

    > DM.tOrders.Refresh;

    >

  • Profile
    박재근 2001.05.21 21:11


    TTable을 쓰면 Table에 Lock이 걸릴 가능성이 아주 높습니다.

    왜냐하면, TABLE은 물리적 구조와 논리적(사용자 프로그램)의 구조 및 데이타를 동일시 하게 합니다.



    그래서 제 생각으로는 TQuery를 사용하여 해결하시는 것이 마탕하리라 사료됩니다.



    Tquery에서 update하고, ttable을 refresh하는 것이 어떨려는지



    최혜룡 wrote:

    > 일련번호를 구하는 부분이 어찌 되어있는지 궁금하군요

    > 아마 그게 문제일것 같은데....

    > 혹, Loop되는건 아닌지..안보고는 힘드네요

    > 그리고 InsertMode인데 Edit하는 이유가 궁금하네요

    >

    > 이석현 wrote:

    > >

    > > 오라클 8.0 에 여러사용자가 동시에 접속해서 데이타 추가/수정/삭제/저장 등의

    > >

    > > 작업을 빈번하게 사용하는 프로그램을 개발중에 있습니다..

    > >

    > > 근데 두명의 사용자가 동시에 프로그램 사용중 한사람이 저장을 하면 다른 사용자가

    > >

    > > 저장버튼을 눌러도 프로그램이 동작하지 않고 SQL모래시계만 계속 보이고 한참 후에야

    > >

    > > 동작을 한다고 하는군여..

    > >

    > > 물론 저장 버튼 클릭시에 commit을 해주었구요..

    > >

    > > 혹시 모를까봐 한사람이 데이타 저장한후에 refresh까지 했습니다..

    > >

    > > 그런데도 그런 문제가 계속 발생을 하는것 같습니다.. 오라클에 접속해서 여러사용자

    > >

    > > 가 입출력 작업을 할때 Database 컴포넌트에 특별한 옵션을 주어야 하는건지..

    > >

    > > 이럴땐 어떻게 처리를 해야하는건지 정말 난감합니다..

    > >

    > > 유저 측에서 아주 난리를 칩니다.. 제발 도와주세여...

    > >

    > > 참고로 오라클이 탑재되어있는 PC사양은 NT서버에 메모리 128메가 펜3-500으로

    > >

    > > 알고있습니다.. 서버가 너무 딸려서 그러는것은 아닌지요?

    > >

    > > 참고로 아래의 소스는 저장버튼 클릭시에 코딩입니다

    > >

    > > 일련번호가 프라이머리키도 되어있고, 아무래도 다른쪽에서 일련번호 딴것을

    > >

    > > 다른 유저가 똑같은 일련번호를 따와서 그런것 같습니다..

    > >

    > > 그래서 일련번호의 최대값도 저장시에 따오도록 했는데.. 쩝

    > >

    > > 다른 유저가 저장한 일련번호를 읽어오지 못하는것 같습니다..

    > >

    > > if MessageDlg('자료를 저장하시겠습니까? ',mtConfirmation, [mbYes, mbNo], 0) = mrYes then

    > > begin

    > > try

    > > DM.Sales.StartTransaction;

    > > if TableMode = 'InsertMode' then

    > > begin

    > > GetMaxOrders(0,MaxNo);

    > > DM.TOrders.Edit;

    > > DM.TOrders.FieldByName('ID').AsString := MaxNo;

    > > DM.TOrders.Post;

    > > end;

    > >

    > > DM.Sales.Commit;

    > > except

    > > On E:Exception do begin

    > > if pos('Key violation', E.Message) > 0 then

    > > ShowMessage('키값이 중복되었습니다.!')

    > > else if pos('Update failed', E.Message) > 0 then

    > > ShowMessage('저장에 실패하였습니다.!')

    > > else

    > > ShowMessage(E.Message+'로 인하여 데이타베이스를 최종저장하기 전상태로 환원합니다');

    > > DM.Sales.Rollback;

    > > end;

    > > end;

    > > end;

    > > DM.tOrders.Refresh;

    > >