ADO.NET, Закрытие OracleConnection без предварительной фиксации или отката: произойдет ли утечка? - PullRequest
3 голосов
/ 21 апреля 2009

Предположим, я делаю следующее:

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();
}

Должен аккуратно утилизировать что-либо и прояснить, что происходит.

1 Ответ

2 голосов
/ 21 апреля 2009

Это не будет течь. Предложение using гарантирует, что OracleConnection будет удален, независимо от того, успешно ли выполнена команда или произошел сбой с исключением, и он примет транзакцию с ним.

Но так как OracleTransaction является IDisposable, вероятно, было бы неплохо поместить предложение использования вокруг транзакции, например,

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

Это сделает читателей кода более понятными, что транзакция очищается; в частности, это может стать важным, если последующее расширение выполняет несколько транзакций для одного и того же соединения.

Кроме того, согласно приведенному ниже комментарию Джона, вы должны поместить оператор использования в OracleCommand, чтобы его можно было быстро очистить.

...