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 回答