を破棄するにはtry-finally
、またはステートメントを使用する必要がありますか?using
SqlTransaction
持っていて損はありません。これは、 IDisposableを実装するすべてのクラスに当てはまります。それ以外の場合、このインターフェイスは実装されません。
ただし、通常、ガベージ コレクターは参照されていないオブジェクトを処理します (GC が dispose を呼び出すという意味ではありませんが、これは true ではありません)。したがって、管理されていないリソースに対してのみ必要です。dispose
しかし、他のすべての変数を呼び出したり、どこでもusing ステートメントを使用したりしたくないため、クラスのDispose
メソッドの実際の実装を調べることは常に価値があります。
SqlTransaction.Dispose
:
protected override void Dispose(bool disposing)
{
if (disposing)
{
SNIHandle target = null;
RuntimeHelpers.PrepareConstrainedRegions();
try
{
target = SqlInternalConnection.GetBestEffortCleanupTarget(this._connection);
if (!this.IsZombied && !this.IsYukonPartialZombie)
{
this._internalTransaction.Dispose();
}
}
catch (OutOfMemoryException e)
{
this._connection.Abort(e);
throw;
}
catch (StackOverflowException e2)
{
this._connection.Abort(e2);
throw;
}
catch (ThreadAbortException e3)
{
this._connection.Abort(e3);
SqlInternalConnection.BestEffortCleanup(target);
throw;
}
}
base.Dispose(disposing);
}
ここで何が起こっているのかをすべて (または何も) 理解していなくても、これは単純な問題ではないと言えますbase.Dispose(disposing)
。そのため、SqlTransaction が確実に破棄されるようにすることをお勧めします。
ただしSqlConnection.BeginTransaction
、トランザクションを作成するため、これも反映することをお勧めします。
public SqlTransaction BeginTransaction(IsolationLevel iso, string transactionName)
{
SqlStatistics statistics = null;
string a = ADP.IsEmpty(transactionName) ? "None" : transactionName;
IntPtr intPtr;
Bid.ScopeEnter(out intPtr, "<sc.SqlConnection.BeginTransaction|API> %d#, iso=%d{ds.IsolationLevel}, transactionName='%ls'\n", this.ObjectID, (int)iso, a);
SqlTransaction result;
try
{
statistics = SqlStatistics.StartTimer(this.Statistics);
SqlTransaction sqlTransaction = this.GetOpenConnection().BeginSqlTransaction(iso, transactionName);
GC.KeepAlive(this);
result = sqlTransaction;
}
finally
{
Bid.ScopeLeave(ref intPtr);
SqlStatistics.StopTimer(statistics);
}
return result;
}
ご覧のように。トランザクションが作成されると、GCは接続を維持します。また、トランザクションを返すだけなので、トランザクションへの参照も保持しません。したがって、接続がすでに破棄されている場合でも、破棄されない場合があります。トランザクションを破棄する別の引数。
よりもフェイルセーフなTransactionScope
クラスを見ているかもしれませんBeginTransaction
。詳細については、この質問をご覧ください。