3

トランザクションスコープの階層を持つことは可能ですか?

外部トランザクションスコープが破棄した場合、内部トランザクションスコープで行われた変更はどうなりますか?

私の特定の問題は、トランザクションスコープを持つコードを実行するテストコードがあることです。トランザクションスコープを使用して2番目のコードセットを呼び出すと、「破棄されたオブジェクトにアクセスできません。トランザクション」が表示されます。内側のトランザクションスコープの破棄が外側のトランザクションスコープも破棄している可能性があります。

4

3 に答える 3

3

私はこれが起こっていることではないかと思います。必要に応じて、基盤となるテクノロジーが分散トランザクションをサポートしている限り、TransactionScopesをネストできます。たとえば、トランザクションを開始してデータベースAのデータを更新してから関数を呼び出し、その関数内で新しいTransactionScopeを作成してデータベースBにデータを挿入すると、内部トランザクションは「アンビエント」を使用します。すでに開いているトランザクション。ただし、これを機能させるには、分散トランザクションコーディネーターを実行する必要があります(SQL Serverの場合)。また、SQL Server 2005以降では、トランザクションを通常のトランザクションとして開始し、必要に応じて分散トランザクションに昇格させることができますが、SQL 2000には、トランザクションを分散トランザクションとして開始する機能がないため、すべてを分散トランザクションとして開始します。それらを促進します。

ネストされたトランザクションがある場合、最も外側のトランザクションがコミットされるまで、トランザクション全体はコミットされません。

ここにいくつかの詳細があります。

TransactionScopeOptionを見てください。これは、ネストされたトランザクションが外部トランザクションとどのように相互作用するかを決定します。

于 2009-08-26T12:53:12.077 に答える
2

外部トランザクションが失敗すると、すべての内部トランザクションがロールバックされます。内側のものをコミットし、外側を破棄すると、内側はロールバックします。実際、外側がコミットして許可しない限り、内側はコミットしません。

あなたは外側のものをコミットしていますね?これに関する良い論文については、ここを参照してください。

于 2009-08-26T12:54:08.613 に答える
1

はい、トランザクションスコープの階層を持つことは可能です。このブログ投稿では、それらがどのように機能するか、特に内部トランザクションスコープをインスタンス化する方法、およびトランザクションがどのように完了してコミットするかについて説明しています。

トランザクションとトランザクションスコープの違いを覚えておくことが重要です。デフォルトでは(つまり、の意味でTransactionScopeOption)、トランザクションスコープをネストする場合でも単一のトランザクションのみを使用します。

「破棄された」エラーメッセージについては、この質問を参照してください。

于 2009-10-11T13:17:21.723 に答える