時々、“無効なトランザクションオブジェクト”例外?

StackOverflow https://stackoverflow.com/questions/420022

  •  05-07-2019
  •  | 
  •  

質問

このコードに何か問題がありますか?
時々、未処理の「無効なトランザクションオブジェクト」を取得します。例外:

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top