gpt4 book ai didi

oracle - ADO.NET,在没有事先提交或回滚的情况下关闭 OracleConnection : Will it leak?

转载 作者:行者123 更新时间:2023-12-02 05:15:01 26 4
gpt4 key购买 nike

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

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

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

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

关于oracle - ADO.NET,在没有事先提交或回滚的情况下关闭 OracleConnection : Will it leak?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/771739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com