7

TransactionScope クラスがどのように機能して異なるメソッド呼び出し間でトランザクションを維持するのか (パラメーターとして渡す必要なし) を疑問に思っていましたが、この疑いに至りました。この質問については、2 つの考慮事項があります。

1

Telerik JustDecompile を使用して TransactionScope の実装を調べると、現在のトランザクションが System.Transactions.ContextData クラスの ThreadStatic メンバーに格納されていることがわかりました (以下のコード)。

internal class ContextData
{
    internal TransactionScope CurrentScope;

    internal Transaction CurrentTransaction;

    internal DefaultComContextState DefaultComContextState;

    [ThreadStatic]
    private static ContextData staticData;

    internal WeakReference WeakDefaultComContext;

    internal static ContextData CurrentData
    {
        get
        {
            ContextData contextDatum = ContextData.staticData;
            if (contextDatum == null)
            {
                contextDatum = new ContextData();
                ContextData.staticData = contextDatum;
            }
            return contextDatum;
        }
    }

    public ContextData()
    {
    }
}

CurrentData プロパティは TransactionScope の PushScope() メソッドによって呼び出され、最後のプロパティはほとんどの TransactionScope コンストラクターによって使用されます。

private void PushScope()
{
    if (!this.interopModeSpecified)
    {
        this.interopOption = Transaction.InteropMode(this.savedCurrentScope);
    }
    this.SetCurrent(this.expectedCurrent);
    this.threadContextData.CurrentScope = this;
}

public TransactionScope(TransactionScopeOption scopeOption)
{
    // ...
    this.PushScope();
    // ...
}

わかりました、私は彼らがそれを行う方法を見つけたと思います。

2

ASP.NET スレッドの切り替えが発生する可能性があるため、ThreadStatic メンバーを使用して ASP.NET (http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx) 内にオブジェクトを格納することがいかに悪いかについて読んだことがあります。ワーカー スレッド間で失われる可能性があります。

つまり、TransactionScope は ASP.NET では動作しないように見えますよね? しかし、Web アプリケーションでこれを使用した限りでは、トランザクション データが失われるという問題に遭遇したことは覚えていません。

ここでの私の質問は、「ASP.NET のスレッド切り替えを処理するための TransactionScope のトリックは何ですか?」です。

TransactionScope がトランザクション オブジェクトを格納する方法について表面的な分析を行いましたか? または、TransactionScope クラスは ASP.NET で動作するように作成されていませんでした。私はそれについて何の苦労もしなかった幸運な男と見なすことができますか?

.NET の「非常に深く埋もれた秘密」を知っている人は、それを説明してくれますか?

ありがとう

4

1 に答える 1

1

ASP.NET スレッドの切り替えは、特定の状況 (非同期 IO 操作を含む) で、要求のライフ サイクルの早い段階でのみ発生すると考えています。通常、制御が実際の http ハンドラー (Page など) に渡されると、スレッドは切り替えられません。ほとんどの場合、トランザクション スコープはその後 (page_init/load の後) にのみ初期化され、問題にはならないと思います。

以下に、興味のあるリンクをいくつか示します。

http://piers7.blogspot.com/2005/11/threadstatic-callcontext-and_02.html

http://piers7.blogspot.com/2005/12/log4net-context-problems-with-aspnet.html

于 2011-09-19T05:40:37.697 に答える