![](/img/trans.png)
[英]What happens to connection object after transaction.Commit or Rollback
[英]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
。 SqlTransaction
和DbTransaction
和IDisposable
相同。
因此,您的代码可能如下所示:
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.