Q&A

  • 왕초보가 급한질문하나 드리겠습니다 ㅠㅠ Transaction 관련입니다..
날씨가.. 급 추워졌습니다 ^^
제가 급해서 이렇게 질문을 드립니다..

A유저와 B유저가 자기 아이디를 입력하는 로직이 있는데요..
프로그램을 실행하면 디피에접속해서 자기 아이디를 입력합니다..
문제는 A유저와 B유저가 동시에 프로그램을 실행했을경우(더 많은유저가있습니다..)
A유저가 디비에 자기 아이디를 입력이나 업데이트하기전까지 B유저는 대기해야하는데요..

자료를 찾아보니 startTransaction을 사용하면 된다고 나오더라구요..
그래서 밑에소스처럼 코딩했습니다

그리고 컴두대로 한컴에선 디버그모드로 실행하고 걸려있는상태에서(디비에쓰기전)
다른컴에서 프로그램을 실행하면.. 첨실행한 컴에서 디비를 쓰기전까지 기다려야하는거 아닌지요..

A에서 쓰기전에 B가 먼저 디비에 Insert를 하더라구요 ㅠㅠ;;;
제가 테스트를 잘못하는건지... ㅠㅠ

델파이7 파이어버드2.1 을사용하고있습니다..
초보라.. 질문도 허접하내요.. ㅠㅠ

소스에서 불가능하면... 디비에있는 프로시져에서 lock거는 방법은 없는지요..
급해서 이렇게 질문드립니다 ㅠㅠ;;
좋은답변 기다리겠습니다.. 제발 도와주셔용 ㅠㅠ;;;  

procedure TfrmAgent.sp_insert;
begin
  try
    if not (DM.IBCConnection1.InTransaction) then
      DM.IBCConnection1.StartTransaction;

    DM.IBCStoredProc1.UnPrepare;
    DM.IBCStoredProc1.StoredProcName := 'SP_INSERT';
    DM.IBCStoredProc1.Prepare;
    DM.IBCStoredProc1.ParamByName('ID').AsString := sID;
    DM.IBCStoredProc1.ExecProc;

    if (DM.IBCConnection1.InTransaction) then
      DM.IBCConnection1.Commit;
  except
    on E: Exception  do
      begin
        if (DM.IBCConnection1.InTransaction) then
          DM.IBCConnection1.RollBack;

          AppendLogMessage('사용자 등록 DB 에러 ' + E.Message);
          ExitProcess(0);
      end;
  end;
end;

ps: 추운날씨에 감기조심하셔용~ ^^ 오늘도 즐거운하루보내시구요~ ^^
1  COMMENTS
  • Profile
    하늘사랑 2009.01.23 22:57
    혹시요..
    SELECT ... FROM single_table
    [WHERE ...]
    [FOR UPDATE [OF ...]]
    [WITH LOCK]

    이퀘리가 어떤역활을 하는지 아시는분 계신가요? ㅠㅠ;;