Q&A

  • Transaction 처리방법
안녕하십니까 ^.^

넘 모르는 것도 많고 돌아서면 잊어버리는 델파이 초짜입니다.



전표 Table이 다음과 같습니다.

Ymd,Seqno,cnt,Custom,Amt,Dcgubn,Jukryo,Geajung,Kwanri

Key는 Ymd+Seqno+cnt 입니다.



Ymd 는 1999-10-10 이고 Seqno는 1000이고 cnt는 1 부터 10까지일때 저장할때에

이럴경우 UpdateSql를 안쓰고 Query1.Exexsql롤 Insert 할때에

cnt가 1 ~ 10까지가 한트란잭션으로 처리되게 할려면

Transaction 처리는 어떻게 해야합니까?





추가 질문 Transaction을 처리 할때에 UpdateSql을 쓰는 것이 더 좋은 가요?

고수님의 답변 부탁합니다.

건강하세요 꾸벅~

1  COMMENTS
  • Profile
    이재식 1999.10.14 15:44
    박병영 wrote:

    > 안녕하십니까 ^.^

    > 넘 모르는 것도 많고 돌아서면 잊어버리는 델파이 초짜입니다.

    >

    > 전표 Table이 다음과 같습니다.

    > Ymd,Seqno,cnt,Custom,Amt,Dcgubn,Jukryo,Geajung,Kwanri

    > Key는 Ymd+Seqno+cnt 입니다.

    >

    > Ymd 는 1999-10-10 이고 Seqno는 1000이고 cnt는 1 부터 10까지일때 저장할때에

    > 이럴경우 UpdateSql를 안쓰고 Query1.Exexsql롤 Insert 할때에

    > cnt가 1 ~ 10까지가 한트란잭션으로 처리되게 할려면

    > Transaction 처리는 어떻게 해야합니까?

    >

    >

    > 추가 질문 Transaction을 처리 할때에 UpdateSql을 쓰는 것이 더 좋은 가요?

    > 고수님의 답변 부탁합니다.

    > 건강하세요 꾸벅~



    이재식 Wrote :

    안녕하세요?

    고수는 아닙니다만....



    데이터를 어디에 임시로 가지고 있다가 테이블에 저장을 하시는것인지...

    이것까지 알면 확실한 답을 드릴 수 있을텐데요...



    우선 간단히나마 설명을 해야 겠습니다.

    이런경우라고 가정합시다.

    Ymd, SeqNo는 똑같고요, 단지 cnt값만 1에서 10까지 저장을 한다고 말입니다.

    즉, 대충 데이터 형식은 이렇게 되겠죠.

    Ymd SeqNo cnt

    1999-10-10 1000 1

    1999-10-10 1000 2

    1999-10-10 1000 3

    .

    .

    1999-10-10 1000 10

    이렇게 되는 경우입니까?



    아무튼, 많은 방법중에 이런방법이 있습니다.(필드는 3개만 합시다)



    var

    TranYesNo : Boolean ;





    TranYesNo := True ;



    DataBase1.StartTransaction ;



    for i := 1 to 10 do

    begin

    try

    with Query1 do

    begin

    Close ;

    SQL.Clear ;

    SQL.Add('insert into 테이블명(Ymd, SeqNo, cnt)') ;

    SQL.Add('values(:Ymd, :SeqNo, :cnt)') ;



    ParamByName('Ymd').asString := '1999-10-10' ;

    ParamByName('SeqNo').asString := '1000' ;

    ParamByName('cnt').asString := IntToStr(i) ;



    ExecSQL ;

    end ; //query end

    except

    TranYesNo := false ;

    Break ;

    end ; // try end

    end ; // for end



    if TranYesNo = true then

    DataBase1.Commit

    else

    DataBase1.RollBack ;



    이렇게 말입니다. 일단은 제어변수(TranYesNo)를 true로 해놓고서

    for문을 돌려서 execsql를 하다가 중간에 에러가 나면

    except로 가서 제어변수에 false를 주는 거죠.

    그리고 break문으로 for문을 빠져나오죠.

    왜냐하면, 에러가 났기때문에 그 위 데이터는 insert할 필요가 없으니까요.



    그래서, for문을 빠져나온면 if문을 만나서 에러가 안났으면

    계속 제어변수는 true이므로 commit를 할 것이고,

    중간에 에러가 났다면 제어변수는 false 값을 가지므로

    rollBack를 하죠.



    그리고, transaction과 SQLUpdate하고는 그리 관계가 없어요.

    우리는 UpdateSQL를 가급적이면 사용하지 않는것이 좋습니다.

    UpdateSQL는 자동적으로 삽입, 삭제, 수정을 해주는 것이 아닙니다.



    우리는 이것을 단지 DBGrid를 편집상태로 만들필요가 있을때에만

    사용하는 것이 좋고요, 그것이 가장 안전한 방법입니다.

    특히 C/S개발에서는 가급적 사용하지 맙시다.

    컴포넌트 하나에 프로젝트를 맡기는니 차라리 자신의 코딩을

    믿는것이 훨씬 백배 낫습니다.



    죄송합니다.

    두서없이 괜시리...



    그럼 도움이 되셨으면 하는 마음 간절합니다.



    건강하십시요.