Q&A

  • Midas 에서 트랜잭션을 어떻게...
안녕하세요...



지난번에 트랜잭션에 대해 질문을 드렸는데..답변이 없어 이렇게 다시 올립니다.

SocketConnection 을 이용하여 멀티티어 프로그램을 데이터 환경 테스트 중입니다.



App 서버에서 TDatabase 를 이용해서 트랜잭션을 이용하려고 하는데,

클라이언트에서 해당 테이블에 대해서 Applyupdates 만 주면



" A user transaction is already in progress."



요런 메세지만 나옵니다.

질문을 올려도 답변이 없어 Paradox 는 원래 안돼나보다 해서 InterBase 로 바꾸어서

테스트 해보았습니다. 결과는 잘 되더군요.. IB Component 를 이용하니 말이죠..



근데, MSSQL 로 바꾸어 TDatabase 로 테스트를 해 보니 역시나 안되더군요..

이건 Paradox 라서 안돼는게 아니라 TDatabase 로 트랜잭션을 처리하는 부분에서

제가 모르는 비밀이 있는것 같더군요.. ^^;



혹시나 Multi-Tier 로 프로젝트 경험이 있는 분중에서 TDatabase 로 트랜잭션 처리를

해보신 분이 있으시면 답변을 주시기 바랍니다.



제가 코딩해 놓은 소스는

서버쪽에 Transaction 처리메소드 하나 추가하여

procedure TServer.Trans_mod(iMod:Integer);

begin

case iMod of

0 : Database1.StartTransaction;

1 : Database1.Commit;

2 : Database1.Rollback;

end;

end;



이렇게 놓고 클라이언트 쪽에서는 버튼별로



procedure TfTest2.btn_TransctionClick(Sender: TObject);

begin

SocketConn.AppServer.Trans_mod(0);

end;



procedure TfTest2.btn_CommitClick(Sender: TObject);

begin

SocketConn.AppServer.Trans_mod(1);

end;



procedure TfTest2.btn_RollbackClick(Sender: TObject);

begin

SocketConn.AppServer.Trans_mod(2);

end;



procedure TfTest2.btn_ApplyClick(Sender: TObject);

begin

if ClientDataSet1.ChangeCount > 0 then

ClientDataSet1.ApplyUpdates(-1); -----> 요거를 하면

end;







5  COMMENTS
  • Profile
    나그네 2001.09.26 00:27
    아래의 뉴스그룹을 참조하세요..



    From: Dan Miser (TeamB) (dmiser@execpc.com)

    Subject: Re: Bug in MIDAS 3? - 'A user transaction is already in progress.'

    Newsgroups: borland.public.delphi.database.multi-tier

    View this article only

    Date: 2000/01/31





    This is a known bug, and the VCL patch is available on the MIDAS Bug Fix

    page of my web site.

    --

    Dan Miser

    www.distribucon.com





  • Profile
    김지엽 2001.09.12 06:08
    ApplyUpdate는 CashedUpdate 방식을 사용하는 것 아닌가여?

    그 경우, CashedUpdate모드 나름의 트랜잭션이 실행되게 됩니다.

    해당되는 dataset이 이미 트랜잭션 실행중인데 다시 트랜잭션이 시작되려고 하니까

    에러가 뜨는거겠지요.



    왜 Commit 명령을 구현해놓고 ApplyUpdate를 또 다시 구현하는지 궁금하네요?



  • Profile
    Jiny 2001.09.13 03:45


    안녕하세요.. 지엽님

    제 질문에 관심을 가져 주셔서 감사합니다.

    오늘 종일 밖에 일이 있어 늦게서야 게시판에 오게 되었습니다.



    제 질문에서도 글을 올렸듯이 마이다스를 이용해 Midas 로 테스트를 하고 있는 중입니다.

    클라이언트의 ClientDataSet 에서 처리한 데이터에 대해서 DB 서버로 적용을 하는 명령어가

    ApplyUpdates 이기 때문에 사용하는 것입니다.

    혹시 다른 적용 명령어가 있다면 알려 주시기 바랍니다.



    제가 어제 밤까지 해결책을 찾으면서 웃긴 것이 있는데..

    ClientDataSet 으로 처음 설정한 Packet 만큼의 데이타를 가지고서는

    Transaction 처리가 됩니다. (ApplyUpdates 를 이용해서요..)



    그런데, 모든 데이타 Packet 을 가져온 후에는 트랜젝션 처리가 안됩니다.

    위에 문제되었던 "이미 트랜잭션이 처리중이라는 메세지"만 나오게 되죠..



    다른 해결 방법이 없는것입니까..?







    김지엽 wrote:

    > ApplyUpdate는 CashedUpdate 방식을 사용하는 것 아닌가여?

    > 그 경우, CashedUpdate모드 나름의 트랜잭션이 실행되게 됩니다.

    > 해당되는 dataset이 이미 트랜잭션 실행중인데 다시 트랜잭션이 시작되려고 하니까

    > 에러가 뜨는거겠지요.

    >

    > 왜 Commit 명령을 구현해놓고 ApplyUpdate를 또 다시 구현하는지 궁금하네요?

    >

  • Profile
    스파토이 2001.09.12 05:12


    저기... 죄송한데요...

    실행하면 이런 메세지 왜 떠죠 ?

    실행 :

    SocketConnection1.AppServer.PaintForm('MON');



    오류 :

    Method 'PaintForm' not supported by automation object.



    참고로 PaintForm은 메소드 명입니다.



    AppServer 함수를 사용하구요.



    님처럼 말입니다.



    제발 알려주세요.



    사막에서 오아시스를 만난 기분입니다.



    감사합니다.



  • Profile
    김지엽 2001.09.12 06:13
    해당 오류구문은 말 그대로 Remote Application Server의 Object Method로 해당 메쏘드명이 등록되어 있지 않다는 뜻입니다.



    이유는 여러가지가 있겠지요.



    우선은 Type Library에 해당 메쏘드가 정확히 구현되어 있는지 확인해보세요..

    메쏘드 명이 틀릴 수도 있지만, 입력 파라미터 선언이 잘못되어 있을 수도 있겠네요.



    (아시다시피, 메쏘드 원격 호출의 경우, Type Library에 선언하는 부분은 함수 자체를 선언하고 정의하는 부분과 별도로 존재합니다.)