if Datamd.IBTransaction1.inTransaction then Datamd.IBTransaction1.rollback;
Datamd.IBTransaction1.StartTransaction;
try
with SQLbal do begin
first;
while not eof do begin
try
with DataMd.SQLcode do begin
open;
while not eof do begin
①<=======================
with DataMd.SQLtraffic do begin
sql.add('Update Tr110t Set ');
Execsql;
end;
Next;
end;
end;
if PRT_kubn = 'D' then begin
Metax4R := TMetax4R.create(self); //출력 폼
Metax4R.Taxtab.Open; //임시테이블...
with Metax4R.SQLclcd do begin //계산서 우측 사업자
end;
with Metax4R.SQLmscd do begin //계산서 좌측 사업자
end;
//=======테스트용==========2008.12.22
②<=================================
with DataMd.SQLtraffic do begin
close;
sql.clear;
sql.add('Selectrrr Tr110t Set '); //에러 유발..
Open;
end;
end;
except
③<=================================
raise Exception.Create('');
end;
Next;
end;
end;
Datamd.IBTransaction1.CommitRetaining();
Except
on E:Exception do begin
④<===============================
Datamd.IBTransaction1.rollback;
showmessage(E.Message ' );
exit;
end;
end;
위의 소스는 간략하게 만들긴 했지만..잘 되는 소스입니다.
질문 들어 갑니다.
① 번에서 데이터를 수정합니다.==> OK
② 번에서 에러를 만듭니다. 출력시 에러가 나든..암튼 에러를 하나 맹급니다.
그러면 ③번으로 넘어 갑니다. 에러를 받아 다시 ④번으로 넘깁니다.
④번에서 Rollback 문을 탑니다.
그러니까.. ①번 수정데이터가 롤백 되는거죠...
그런데..아~쒸...
롤백이 안되는겁니다.
① ~ ④ 번까지 다 잘 타는데(디버깅 결과..) 롤백은 안되어 있는겁니다.
참 희한합니다. 물론 저거 땀시 골머리를 앓고 있습니다.
에러가 안나면 문제 없이 잘 되는데..클라이언트의 컴에 출력에러가 생기거나..기타 에러가 있으면
롤백 되어야 하는데...
살펴봐 주시면 감사하겠습니다.
|