3

私が次のことをしているとします。

using (OracleConnection conn = new OracleConnection(connStr))
{
    OracleTransaction trans = conn.BeginTransaction();
    OracleCommand command = new OracleCommand(cmdTxt, conn, trans);
    // this statement is executed in a transaction context:
    command.ExecuteNonQuery();
}
// the using statement will dispose and thus close the connection.
// a rollback is done implicitly

は実行しませんでしたがtransaction.Rollback()、私のテストでは、ロールバックが暗黙的に行われることが示されました。

私の質問は次のとおりです。このコードは接続などをリークしますか?

Edit1: 私はSystem.Data.OracleClient名前空間です。

Edit2: これは考案されたサンプル コードです。より現実的なシナリオは、using ステートメント内で例外が発生し、Commit()ステートメントがまだ実行されていない場合です。

Edit3:答えから、これは有利だと思います:

using (OracleConnection conn = new OracleConnection(connStr))
using (OracleTransaction trans = conn.BeginTransaction())
using (OracleCommand command = new OracleCommand(cmdTxt, conn, trans))
{
    command.ExecuteNonQuery();
    trans.Commit();
}

何かをきれいに処分し、何が起こっているのかを明確にする必要があります。

4

1 に答える 1

2

漏れません。using 句は、コマンドが正常に完了したか例外で失敗したかに関係なく、 OracleConnection が破棄されることを保証し、それでトランザクションを取得します。

しかし、OracleTransaction は IDisposable であるため、トランザクションの前後に using 句を配置することもおそらく良い形式でしょう。

using (OracleTransaction trans = conn.BeginTransaction())
{
  // ...
  trans.Commit();
}

これにより、トランザクションがクリーンアップされていることがコードの読者に明確になります。特に、後続の拡張機能が同じ接続で複数のトランザクションを実行する場合に重要になる可能性があります。

また、以下の John のコメントに従って、OracleCommand の周りに using ステートメントを配置して、すぐにクリーンアップできるようにする必要があります。

于 2009-04-21T09:18:15.030 に答える