2011-07-03 7 views
0

私は、アプリケーション層でインスタンス化され、ネストされたトランザクションを可能にするビジネス層とデータ層に送信されるTransactionContextクラスを書いています。今私は決定する必要があります: 1.明示的なトランザクションを使用し、必要に応じてすべての関数でトランザクションの開始、コミットまたはロールバックを呼び出さなければなりませんか? 2. TransactionContextが作成されたときにトランザクションを暗黙的に開始することができます。ネストされたメソッドのみをロールバックすることができます。トランザクションですべてのdbコールをラップする必要がありますか?

これで、コード作成が簡単になります。トランザクションのロールバックフラグを設定し、ほとんどのメソッドのうちの1つだけがコミットまたはロールバックを心配するようにしてください。問題は、トランザクションですべてのデータベーストラフィックをラッピングするのが良い考えであるかどうかはわかりません。

トランザクション内ですべてのデータベース呼び出しをラップすると、どのような悪影響が及ぶ可能性がありますか?

私の設定は、ASP.NET appliactionとMSSQL Serverデータベースです。 appliactionとデータベースが異なるサーバー上にある可能性があります。それが決定に影響するものであれば可能です。

答えて

3

単一のSQL文は、すでに暗黙的なトランザクションでラップされています。アトミック操作で複数のテーブルを更新する場合など、トランザクションが必要な場所でトランザクションを使用します。 DBへのすべての呼び出しをラップするのは良い考えではありません。スループットとブロッキングの削減につながる可能性があります。

Altough SQL Serverは、ネストされたトランザクションをサポートしてご想像のとおり、彼らは動作しない可能性があります:内部トランザクションをコミット

は、SQL Serverデータベース エンジンによって無視 です。 最も外側のトランザクションの最後に実行された アクションは、 アクションに基づいてコミットまたはロールバックされます。外部トランザクション がコミットされている場合、内部の ネストされたトランザクションも コミットされます。外部取引が ロールバックされている場合、内部 トランザクションもロールバックされます。 トランザクションが個別に行われたかどうかにかかわらず、 がコミットされています。

のRef .: Nesting Transactions

関連する問題