오라클 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;
이석현 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;
>