안녕하십니까..
interbase에서 아래와 같이 작업을 하였는데
commit 한 것이 인식이 안되네요..
우째 이런일이..
commit 하였는데도 말이지요..
고수님들 꼭 도와 주십시요..
박한수 올림
Data Module : DM (default transactio 속성 없음)
Tranaction : TrCntr
Query for Select : QrCntrO (transaction 속성 TrCntr)
Query for Execute : QrCntr E (transaction 속성 없음)
문제의 logic
1.dm.QrCntr0를 이용하여 해당되는 data를 가져옴.
2. data를 가져와서 string에 저장하고 socket에 packet으로 실어 보내고
QrcntrE를 이용하여 send_date와 seq_no 를 update 시킴
3. ack message가 정확한 값이면
QrcntrE를 commit 함
정확한 값이 아나면 rollback 함.
4. 다시 함수를 호출하여, 1번의 select 문을 실행하면,
위의 3번에서 commit한 data가 반영이 안되었는지, send_date null 이 아닌 문장이 또 retrive 됨
5. ibsql로 4번의 문장을 실행시키면, 3번에서 rollback 된 문이 반영되어 있음..
즉, QrCntrE를 이용하여 commit를 하였는데도
QrCntrO에서 확인해 보면 commit 가 된 문장이 반영되어 있지 않습니다...
우째 이런 일이..
흑흑흑..
박한수 올림
procedure TBusMainForm.SendSaleData();
var
sSql : String;
iRecCnt : Integer;
sSnd : String;
sRcv : String ;
begin
sSql := '';
sSnd := '';
iRecCnt := 0;
if Dm.TrCntr.InTransaction = False then Dm.TrCntr.StartTransaction;
with Dm.QrCntrO do
begin
Try
Close;
Sql.Clear;
sSql := 'select TAG_DATE,CARD_NO,MACH_NO,TRADE_NO,FEE,';
sSql := sSql + 'CARD_FLAG,TRA_FLAG,RATE_DISC,RECV_DATE,GUGAN_CD from rawdata ';
sSql := sSql + 'where send_date is null ';
Sql.Text := sSql;
if Prepared = False then Prepare;
open;
Except
exit;
end;
FetchAll;
if (isEmpty) then
begin
SendEvtData();
Exit;
end;
sSnd := FormatFloat('0000000',g_iCntrSaleDataSeqNo); // First Sequence
First;
while not(EOF) do
begin
If(iRecCnt > 18) then Break; // 19분을 가져와서 소켓으로 실어 보냄
sSnd := sSnd + FormatDateTime('yymmddhhmmss',Fields[0].AsDateTime) + //tagdate(12)
CompCardNo(Fields[1].AsString,1) + // Card No(5)
FormatFloat('0000',Fields[2].AsInteger) + //mach_no(4)
FormatFloat('00000',Fields[3].AsInteger) + //TRADE_NO(5)
FormatFloat('00000',Fields[4].AsInteger) + // FEE(5)
Fields[5].AsString + // Card Flag(1)
Fields[6].AsString + // TRAG_FLAG(1)
Fields[7].AsString + // RATE_DISC (2)
FormatDateTime('yymmddhhmmss',Fields[8].AsDateTime)+ //recv_date(12)
Fields[9].AsString; // GUGAN_CD (2)
with Dm.QrCntrE do
begin
close;
sql.clear;
sSql := 'update RAWDATA Set Send_Date=:Send_Date,SEQ_NO=:SEQ_NO ' ;
sSql := sSql + 'where TAG_DATE=:TAG_DATE and CARD_NO=:CARDNO and MACH_NO=:MACH_NO';
sql.text := sSql;
if Prepared = False then Prepare;
Params[0].AsDateTime := Now;
Params[1].AsInteger := g_iCntrSaleDataSeqNo + iRecCnt;
Params[2].AsDateTime := Dm.QrCntrO.Fields[0].AsDatetime;
Params[3].AsString := Dm.QrCntrO.Fields[1].AsString;
Params[4].AsInteger := Dm.QrCntrO.Fields[2].AsInteger;
Dm.QrCntrE.ExecSql;// 1건식 가져 온 것에 대하여 send_date, seq_no update 반영
end;
next;
inc(iRecCnt);
end;
g_sCntrSendCmd := CMDSTR_SaleData;
sRcv := CntrSRData(sSnd); // 소켓으로 문장을 날니는 함수
try
if sRcv <> '' then
if (StrToInt(Copy(sRcv,3,7)) = g_iCntrSaleDataSeqNo+iRecCnt) then
begin
Dm.TrCntr.Commit; //소켓의 ack message가 정확한 값이면 commit를 때림
g_iCntrSaleDataSeqNo := g_iCntrSaleDataSeqNo + iRecCnt;
end
else Dm.TrCntr.Rollback
else Dm.TrCntr.Rollback;
except
Dm.TrCntr.Rollback;
end;
end;
end;
|