C# コードでトランザクション処理をカプセル化しようとしています。これを実現するために、TransactionProvider というクラスを作成しました。
public class TransactionProvider : IDisposable
{
public SqlTransaction Transaction { get; private set; }
private SqlConnection connection;
private bool disposed;
public TransactionProvider(string connectionString, IsolationLevel isolationLevel, string transactionName)
{
connection = new SqlConnection(connectionString);
connection.Open();
Transaction = connection.BeginTransaction(isolationLevel, transactionName);
}
public void Dispose()
{
if (!disposed)
{
Transaction.Dispose();
connection.Dispose();
disposed = true;
}
}
}
使用法:
using (TransactionProvider transactionProvider = new TransactionProvider(ProductionRepository.ConnectionString, IsolationLevel.RepeatableRead, "GetPolicyNumbers"))
{
foreach (Policy policyDetail in policiesDetails)
{
policyNumbers.Add(GetPolicyNumber(policyDetail.Product, transactionProvider.Transaction));
}
transactionProvider.Transaction.Commit();
}
ここでの考え方は、'using' ステートメントでこのクラスをインスタンス化し、できるだけ早く SQL への接続を解放する (+トランザクションを終了する) ことです。いくつか読んだ後、ここで IDisposable を処理する方法がまだわかりません。TransactionProvider は管理されていないリソースに直接アクセスしないため、デストラクタを実装する理由はないと判断しました。残っている唯一のことは、SQLTransaction と SQLConnection の両方がファイナライズされていることを確認することだと思います。上記のコードは仕事をしますか?TransactionProvider オブジェクトが範囲外になるとすぐに、すべての接続が閉じられるようにしますか?