TransactionScopeクラスを使用するのに最適な場所はどこですか?それはビジネスロジックまたはデータ/リポジトリクラスにありますか?
ビジネスロジッククラスで使用する場合の例:
using (var scope = new TransactionScope())
{
Repository.DoSomething();
Repository.DoSomethingMore();
scope.Complete();
}
データ/リポジトリクラスで使用する場合の例:
using (var scope = new TransactionScope())
{
"INSERT INTO ..." // some actual SQL
scope.Complete();
}
単一のトランザクションは、システム内の単一の一貫した操作を表します。トランザクションを開始する場所は、ビジネスニーズにのみ依存します。
典型的なシナリオは銀行振込です。この場合、口座Aから資金が引き落とされ、口座Bに入金されていることを確認する必要があります。この場合、データベース操作を行う前に、引き出し/クレジットをトランザクションにラップして、操作を完全に完了させます。 。
ビジネスオペレーションでデータベースに複数の変更が必要であり、すべてのオペレーションを実行するか、まったく実行しないことが重要な場合は、ビジネスレイヤーでトランザクションを開始するのが適切です。
単一の挿入(2番目の例)のような単純なクエリの場合、トランザクションはデフォルトで操作の安全性を保証するため、トランザクションを実行する必要はありません。
トランザクションではなくトランザクションスコープの利点の1つは、接続を参照せずに使用できることです。
これにより、データレイヤーの外部で使用できるようになるため、ビジネスロジックは、2つ以上のデータ操作を同じトランザクションに含めるかどうかを決定できます。
ただし、TransactionScopeはまだそれをサポートする接続オブジェクトに依存していると述べました。したがって、DALの外でそれを使用すると、この隠れた依存関係が生じます。これは理想からかけ離れています。
私の個人的なアプローチは、InsertMyObject(connection con)などの汎用プライベートメソッドがトランザクションがスコープ内にあり、UpdateMyObjectsByDate()などの特定のパブリックメソッドがトランザクションを作成し、必要に応じてプライベートメソッドを呼び出すことを想定しているリポジトリクラスでの使用を維持することです。
特定の方法はビジネスロジックとある程度重複していると主張できます。しかし、それは「ハード」ではなく「やわらかい」問題であり、実際に私が指摘できる依存関係があります。問題