假设我正在执行以下操作:

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

应该干净地处理任何东西并弄清楚发生了什么。

最佳答案

它不会泄漏。 using 子句保证 OracleConnection 将被处理,无论命令是成功完成还是失败并出现异常,并且它将处理事务。

但是由于 OracleTransaction 是 IDisposable,因此在事务周围放置 using 子句可能是一种很好的形式,例如

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

这将使代码的读者更清楚交易正在被清理;特别是,如果后续增强在同一个连接上执行多个事务,这可能会变得很重要。

此外,根据下面约翰的评论,您应该在 OracleCommand 周围放置一个 using 语句,以便可以及时清理它。

关于oracle - ADO.NET,在没有事先提交或回滚的情况下关闭 OracleConnection : Will it leak?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/771739/

10-16 10:45