假设我正在执行以下操作:
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();
}
应该干净地处理任何事情并明确发生的事情。
答案 0 :(得分:2)
它不会泄漏。 using子句保证将处置OracleConnection,无论命令是成功完成还是因异常而失败,它都会接受该事务。
但是由于OracleTransaction是IDisposable,因此在事务中放置using子句可能是一种好的形式,例如。
using (OracleTransaction trans = conn.BeginTransaction())
{
// ...
trans.Commit();
}
这将使得清理交易的代码的读者更清楚;特别是,如果后续增强功能在同一连接上执行多个事务,则可能会变得很重要。
另外,根据John的评论,你应该在OracleCommand周围放置一个using语句,以便及时清理它。