【问题标题】:ADO.NET, Closing an OracleConnection without prior Commit or Rollback: Will it leak?ADO.NET,在没有事先提交或回滚的情况下关闭 OracleConnection:它会泄漏吗?
【发布时间】:2009-04-21 09:09:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: oracle ado.net transactions oracleclient


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我怀疑与 OracleCommand 相同。任何一次性的东西都需要处理掉,可能在 using 块中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2014-04-03
    相关资源
    最近更新 更多