web-dev-qa-db-ja.com

TransactionScopeとLINQ to SQLのトランザクション

LINQ to SQLの古典的なトランザクションパターンの違いは何ですか。

using(var context = Domain.Instance.GetContext())
{
    try
    {
        context.Connection.Open();
        context.Transaction = context.Connection.BeginTransaction();
        /*code*/
        context.Transaction.Commit();
    }
    catch
    {
        context.Transaction.Rollback();
    }         
}

vs TransactionScopeオブジェクト

using (var context = Domain.Instance.GetContext())
using (var scope = new TransactionScope())
{
    try
    {
        /*code*/
        scope.Complete();
    }
    catch
    {
    }
}
76
Ben McNiel

Linq2SQLは暗黙的なトランザクションを使用します。すべての更新が単一の送信内で行われる場合、トランザクションを自分で処理する必要はありません。

ドキュメントから(エンファシス鉱山):

SubmitChangesを呼び出すと、LINQ to SQLは、呼び出しがトランザクションのスコープ内にあるかどうか、またはトランザクションプロパティ(IDbTransaction)がユーザー開始のローカルトランザクションに設定されているかどうかを確認します。 どちらのトランザクションも見つからない場合、LINQ to SQLはローカルトランザクション(IDbTransaction)を開始し、それを使用して生成されたSQLコマンドを実行します。すべてのSQLコマンドが正常に完了すると、LINQ to SQLはローカルトランザクションをコミットし、戻ります。

35
TGnat

TransactionScope を使用する場合、try/catch構文は必要ありません。スコープが終了したときにトランザクションをコミットするには、スコープで Complete を呼び出すだけです。

そうは言っても、TransactionScopeは通常、トランザクション状態を渡すことなくトランザクションを必要とする他のメソッドへの呼び出しをネストできるため、より良い選択です。

BeginTransaction オブジェクトで DbConnection を呼び出すとき、同じトランザクションで他の操作を実行する場合は、そのトランザクションオブジェクトを渡す必要があります。しかし、別の方法で。

TransactionScopeを使用すると、スコープが存在する限り、スレッド上の現在の Transaction に登録されているすべてのものが処理され、コードがよりクリーンになり、保守しやすくなります。

さらに、データベースへの接続だけでなく、トランザクションに参加できる他のリソースを使用できるという利点もあります。

接続とデータベース操作を最大限に活用する必要がある状況では、TransactionScope;を使用したくない場合があることに注意してください。単一のデータベースに対しても、分散トランザクションコーディネーターが使用され、トランザクションが分散トランザクションに変換される可能性があります(単一のデータベース接続であっても)。

これらの場合、設計を濁らせながら、接続固有のトランザクションの受け渡しを検討することをお勧めします。

または、1つのリソースを一貫して(同じスレッドで)使用することがわかっている場合は、接続を参照カウントするクラスを作成することができます/トランザクション。

構築時にリソースを作成する/カウントを増やすクラスを作成します。また、 IDisposable (カウントがゼロの場合、デクリメント/リリース/コミット/アボート)を実装し、 ThreadStaticAttribute に適用されます。

これにより、トランザクション管理をロジックコードから分離し、(分散トランザクションにエスカレートする代わりに)かなり効率的に単一のリソースを保持することができます。

75
casperOne

大きな違いの1つ(難解な教訓)– TransactionScopeは、トランザクション管理にMS DTCを使用します。

アプリケーションがデータベーストランザクションのみを管理する必要があり、サービスやリモートコールが関与していない場合、データベース固有のトランザクション(DbTransactions)を使用して、MS DTCに関連する潜在的な問題をスキップできます。

21
Mayank

TransactionScopeは、すべてのリソースマネージャー(SQLサーバー、Active Directory、ファイルシステムなど)の統合管理を提供します。さらに、独自のリソースマネージャーを記述することができます。トランザクションスコープを検出し、SQLサーバーとまったく同じように動作するコード。トランザクションの他の参加者と同様に変更をコミットまたは取り消します。 TransactionScopeが主流であり、MS SQLネイティブトランザクションを巨大なtrapに陥るまで忘れていたと信じていました。 Windows Server 2008 WEB Editionには制限付きの分散トランザクションコーディネーターサービスが付属しており、トランザクションスコープは単一のコンピューターでのみ機能します。 IISおよびSQLサーバーが異なるコンピューターにインストールされている場合、このシステムでASP.NETアプリケーションは失敗します。ほとんどのパブリックドメインプロバイダーがWindows Server WEBエディションを提供し、SQLサーバーが別のサーバーにあることを考慮してくださいこれは、明示的なトランザクション管理を使用してネイティブトランザクションを操作する必要があることを意味します…

7

TransactionScopeクラスがADO.NETの基礎となる接続とインターフェイスしてトランザクションを作成またはコミットまたはロールバックするのと基本的に同じであると思います。 TransactionScopeクラスが作成されたのは、ADO.NET永続性をよりクリーンにするためです。

編集:casperOneの追加に関するステートメントの明確化 トランザクションを作成するのはTransactionScopeであり、接続は、TransactionScopeによって作成されたトランザクションを参照し、使用可能なため使用します。

4
Chris Marisic