![](/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.