Q&A

  • Transaction, Rollback, Commit 사용하기
Paradox DB를 사용하며 Alias 이름을 MyData라고 했습니다.

MyData를 여러명이 네트워크로 조회, 입력, 수정, 삭제 작업을 합니다.

물론 MyData 내의 한 테이블에 여러명이 한꺼번에 조회, 입력, 수정, 삭제 작업을 할 수 도 있습니다.

이 때 Paradox DB로 무리가 없는지 궁금합니다. 혹시 이렇게 사용하신 적이 계신 분의 경우를 알려 주시면 좋겠습니다.



************아니면 Transaction 거는 걸 가르쳐 주세요.*********************



한번 저장 버튼을 누르면



//작업 A

Table1.Append;

Table1.FieldByName('Code').AsInteger := StrToInt(edtCode.text);

Table1.FieldByName('Name').AsString := trim(edtName.text);

....

Table1.Post;



//작업B

Query1.Close;

Query1.SQL.Clear;

Query1.SQL.Add('Update Data1 set Field1 = "' + edtField1.text + '" ');

Query1.SQL.Add('where Field0 = ' + edtField0.text);

Query1.ExecSQL;



//작업C

if Table2.FindKey([a]) then

begin

Table2.Delete;

End;



과 같은 작업을 한꺼번에 행합니다.

작업 A,B,C 중 모두 성공하면 저장(Commit)하고 하나라도 에러가 나면 모든 작업을 취소(rollback)하는 작업을 어떻게 하는지 알려 주세요.



DB 자체에 Transaction을 걸면 될 것 같은데 잘 안 됩니다.

처음 프로그램 Open할 때

DataBase1.Connected := True;

로 했고 DataBase1에 Alias Name을 MyData로 DataBasName을 MyData로 했습니다.



그리고 저장하는 버튼에 아래와 같이 했습니다.



try

DataBase1.StartTransaction

//작업 A

.....

//작업 B

.....

//작업 C

.....

DataBase1.Commit;

MessageDlg('처리되었습니다....',mtInformation,[mbOk],0);

except on E:EDBEngineError do

begin

MessageDlg(E.Errors[0].Message,mtError,[mbOk],0);

DM.Database1.Rollback;

end;

end;



그러나 "The transaction isolation level must be dirt read for local databse"라는 에러 메세지가 StartTransaction에서 발생합니다.

Help를 봐도 잘 모르겠습니다.



여하튼 Transaction 거는 정석을 부탁드립니다. 세밀하게요 이왕이면 예제도 함께. 원래 VB로 프로그램 짜다 Delphi로 구현하는데 가끔

DB 관련한 작업이 좀 힘이 드네요.



부탁드립니다. 꾸벅...





1  COMMENTS
  • Profile
    류기동 1999.08.12 18:59
    Paradox자체에서 transaction 처리를 하지 않기 때문에

    commit, rollback을 지원하지 않습니다.

    이런 경우에는 델파이 콤포넌트에서 지원하는

    cached update속성을 디비가 하는 작업을 리얼타임으로 바로

    테이블에 갱신하지 않고 임시로 저장을 했다가

    applyupdate 메서드가 나올때 직접 테이블에 저장을 해줍니다.



    그러므로 table이나 query에서 cached update를 true로 한다음에

    commit 할부분에서 applyupdate메서드를 쓰면

    commit이 됩니다.





    윤영기 께서 말씀하시기를...

    > Paradox DB를 사용하며 Alias 이름을 MyData라고 했습니다.

    > MyData를 여러명이 네트워크로 조회, 입력, 수정, 삭제 작업을 합니다.

    > 물론 MyData 내의 한 테이블에 여러명이 한꺼번에 조회, 입력, 수정, 삭제 작업을 할 수 도 있습니다.

    > 이 때 Paradox DB로 무리가 없는지 궁금합니다. 혹시 이렇게 사용하신 적이 계신 분의 경우를 알려 주시면 좋겠습니다.

    >

    > ************아니면 Transaction 거는 걸 가르쳐 주세요.*********************

    >

    > 한번 저장 버튼을 누르면

    >

    > //작업 A

    > Table1.Append;

    > Table1.FieldByName('Code').AsInteger := StrToInt(edtCode.text);

    > Table1.FieldByName('Name').AsString := trim(edtName.text);

    > ....

    > Table1.Post;

    >

    > //작업B

    > Query1.Close;

    > Query1.SQL.Clear;

    > Query1.SQL.Add('Update Data1 set Field1 = "' + edtField1.text + '" ');

    > Query1.SQL.Add('where Field0 = ' + edtField0.text);

    > Query1.ExecSQL;

    >

    > //작업C

    > if Table2.FindKey([a]) then

    > begin

    > Table2.Delete;

    > End;

    >

    > 과 같은 작업을 한꺼번에 행합니다.

    > 작업 A,B,C 중 모두 성공하면 저장(Commit)하고 하나라도 에러가 나면 모든 작업을 취소(rollback)하는 작업을 어떻게 하는지 알려 주세요.

    >

    > DB 자체에 Transaction을 걸면 될 것 같은데 잘 안 됩니다.

    > 처음 프로그램 Open할 때

    > DataBase1.Connected := True;

    > 로 했고 DataBase1에 Alias Name을 MyData로 DataBasName을 MyData로 했습니다.

    >

    > 그리고 저장하는 버튼에 아래와 같이 했습니다.

    >

    > try

    > DataBase1.StartTransaction

    > //작업 A

    > .....

    > //작업 B

    > .....

    > //작업 C

    > .....

    > DataBase1.Commit;

    > MessageDlg('처리되었습니다....',mtInformation,[mbOk],0);

    > except on E:EDBEngineError do

    > begin

    > MessageDlg(E.Errors[0].Message,mtError,[mbOk],0);

    > DM.Database1.Rollback;

    > end;

    > end;

    >

    > 그러나 "The transaction isolation level must be dirt read for local databse"라는 에러 메세지가 StartTransaction에서 발생합니다.

    > Help를 봐도 잘 모르겠습니다.

    >

    > 여하튼 Transaction 거는 정석을 부탁드립니다. 세밀하게요 이왕이면 예제도 함께. 원래 VB로 프로그램 짜다 Delphi로 구현하는데 가끔

    > DB 관련한 작업이 좀 힘이 드네요.

    >

    > 부탁드립니다. 꾸벅...

    >

    >