繁体   English   中英

Transaction.Commit() 是否也会关闭底层连接。 C#

[英]Does Transaction.Commit() closes the underlying connection as well. C#

在 Transaction.Commit()` 之后,我的事务的连接属性设置为 null。 我想知道连接对象会发生什么,它也会关闭吗?

我想确保连接也关闭。 请建议。

所以在调用方法中我编码如下。

System.Data.SQLClient.SQLTransaction trans = null;
System.Data.SQLClient.SQLConnection oConn = null;
trans = oConn.GetIWSTransaction();

trans.commit();

and in GetIWSTransaction() as
Private System.Data.SQLClient.SQLTransaction m_oIWSTransaction = 
null;
Private System.Data.SQLClient.SQLConnection m_oIWSConnection = null;

if(this.m_oIWSConnection.State = System.Data.ConnectionState.Closed)
this.m_oIWSConnection.Open();
this.m_oIWSTransaction = this.m_oIWSConnection.BeginTransaction();

return this.m_oIWSTransaction;

现在的问题是,调用方法中的trans.commit()是否也会终止连接,或者只是将其设置为 null。 如果它只是将其设置为 null 那么我们如何处理连接关闭?(除了使用块之外的任何替代方法)

不,不是的。 如果要关闭连接,建议的方法是将连接放在using块中。 例如

using (DbConnection db = GetDbConnection())
{
  db.Open();
}

释放对象时,连接将关闭。

编辑:就像查理说的那样,理想情况下,交易也应该包含在 using 块中。

您甚至可以使用TransactionScope

#edit:如果您正在学习,请遵循指南。 例如这个

此外,这类低级 SQL 访问(SqlClient 和 ADO.NET)不适合初学者。 您应该研究倾斜的实体框架,或者可能是Dapper (尽管后者已经适用于更高级/有经验的开发人员)。

回到你的代码。 它的设计似乎没有很好的组织。 尝试遵循惯用的设计并将事物保持在一起。

关于using块。 System.Data.SqlClient.SqlConnection派生自DbConnection ,因此是IDisposable SqlTransactionDbTransactionIDisposable相同。

因此,您的代码可能如下所示:

using System.Data.SqlClient;

using (SqlConnection connection = new SqlConnection(...connection string...))
{
    connection.Open();

    SqlCommand command = connection.CreateCommand();
    using (SqlTransaction transaction = connection.BeginTransaction("SampleTransaction"))
    {
        command.Transaction = transaction;
        command.CommandText = ...your SQL...;

        try
        {
            command.ExecuteNonQuery();
            transaction.Commit();
        }
        catch (Exception ex)
        {
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                // This catch block will handle any errors that may have occurred
                // on the server that would cause the rollback to fail, such as
                // a closed connection.
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM