ADO.NET,在没有事先提交或回滚的情况下关闭OracleConnection:它会泄漏吗?

时间:2009-04-21 09:09:36

标签: oracle ado.net transactions oracleclient

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

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()语句尚未执行。

编辑3:从答案我认为这是有利的:

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

应该干净地处理任何事情并明确发生的事情。

1 个答案:

答案 0 :(得分:2)

它不会泄漏。 using子句保证将处置OracleConnection,无论命令是成功完成还是因异常而失败,它都会接受该事务。

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

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

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

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