假设我正在执行以下操作:
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/