ASP.NET 和 ThreadStatic 作为 TransactionScope 实现的一部分



我想知道TransactionScope类是如何在不同的方法调用之间保持事务的(不需要将其作为参数传递),我产生了这个疑问。关于这个问题,我有两个考虑:

<标题> 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 h1> 读到过在ASP中使用ThreadStatic成员来存储对象是多么糟糕。. NET (http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx)。. NET线程切换可能发生,因此该数据可能在工作线程之间丢失。

所以,看起来TransactionScope不应该与ASP一起工作。净,对吧?但就我在我的web应用程序中使用它而言,我不记得我遇到过任何关于事务数据丢失的问题。

我的问题是"TransactionScope处理ASP的技巧是什么?". NET的线程切换?".

我是否对TransactionScope如何存储其事务对象进行了肤浅的分析?或者TransactionScope类不适合与ASP一起工作。NET,我可以被认为是一个幸运的人,从来没有任何痛苦吗?

有谁知道。net"深埋的秘密"可以为我解释一下吗?

谢谢

我相信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

相关内容

  • 没有找到相关文章

最新更新