時々、“無効なトランザクションオブジェクト”例外?
質問
このコードに何か問題がありますか?
時々、未処理の「無効なトランザクションオブジェクト」を取得します。例外:
procedure BlaBla;
var
TD: TDBXTransaction;
begin
TD := SQLConnection.BeginTransaction;
try
SQLConnection.ExecuteDirect('some sql command');
SQLConnection.ExecuteDirect('some sql command');
SQLConnection.CommitFreeAndNil(TD);
except
SQLConnection.RollbackFreeAndNil(TD);
end;
end;
この例外はユーザーに発生しているので、残りはすべてtry..except内にあるため、RollbackFreeAndNilによって発生したと想定します。
RollbackFreeAndNilを別のtry..exceptでラップする必要がありますか?なんて混乱。
Delphi 2009、Firebird 2.1を搭載したDBX、およびDevartのドライバーを使用しています。
解決 2
問題は、SQLConnectionがデータベースに接続されていない場合、SQLConnection.BeginTransactionがnilを返すことです。そして、無効なトランザクションオブジェクトの例外が発生します。
私はそれを期待していませんでした。接続しようとするか、例外を発生させる必要があります。 nilを返すのは意味がありません。
他のヒント
CommitFreeAndNilが例外をスローするとどうなりますか?
RollbackFreeAndNilが呼び出されます。 TDは有効ですか?
例外を食べているので、証拠があります。それをしないでください。再スロー:
procedure BlaBla;
var
TD: TDBXTransaction;
begin
TD := SQLConnection.BeginTransaction;
try
SQLConnection.ExecuteDirect('some sql command');
SQLConnection.ExecuteDirect('some sql command');
except
SQLConnection.RollbackFreeAndNil(TD);
raise;
end;
SQLConnection.CommitFreeAndNil(TD);
end;
場合によっては、cxdbmemoなどのコンポーネントを使用してさまざまな手順を実行し、そのエラーを表示することがあります。そのコンポーネント(またはこのようなもの)を削除し、通常のトランザクションを行う必要があります。
SQLConnection.DBXConnection.BeginTransaction(TDBXIsolations.ReadCommitted);
所属していません StackOverflow