【问题标题】:Is maintain the transaction with a static LINQ to SQL DataContext in asp.net possible?是否可以在 asp.net 中使用静态 LINQ to SQL DataContext 维护事务?
【发布时间】:2011-07-16 11:59:18
【问题描述】:

我有 ASP.NET 应用程序,它使用 LINQ to SQL 与 SQL 服务器连接。当我有一个静态类时,它当然可以在应用程序级别上工作。我在这个静态类中创建了DataContext 的静态对象。 除了这个,我没有在应用程序中创建任何数据上下文对象。当我在每个数据库操作中使用这个静态数据上下文对象时。

那么对于每个登录的用户来说,这是否会将事务保持为线程安全的?

【问题讨论】:

    标签: c# asp.net linq linq-to-sql static


    【解决方案1】:

    注意:以下建议适用于所有实现工作单元模式的 O/RM 工具,例如 Entity Framework 的 ObjectContext、DbContext、NHibernate 的 Session 和 LINQ to SQL 的 DataContext。

    LINQ to SQL DataContext 不是线程安全的。您应该为每个 Web 请求创建(至少)1 个上下文。在多个线程上重用同一个实例意味着一个线程可以调用SubmitChanges,而另一个线程仍在插入新对象。如果幸运的话,DataContext 会抛出异常,因为它不能持久化更改。如果你不走运,DataContext 会成功,你会破坏单个请求的原子性,这可能会导致数据库中的数据不一致。换句话说:您将拥有一个充满垃圾的数据库!

    除此之外,DataContext 将所有对象保存在其缓存中,这意味着您的应用程序的内存消耗将不断增长,这可能导致OutOfMemoryException (OOM)。即使您不会获得 OOM,缓存中的对象也会变得陈旧,尤其是当其他应用程序或进程正在更新您的数据库时,当实体已经在内存中时,您将永远不会看到这些更改。最后要注意的是,您无法回滚在DataContext 中所做的更改,因此当您(在某一时刻)使DataContext 无效(因为错误)时,没有办法恢复它(除了创建一个全新的DataContext)。在这种情况下,您的 AppDomain 注定要失败。

    【讨论】:

      【解决方案2】:

      您决定使用单个 DataContext 对象并不是最佳选择。在您需要时创建它们(事务)。 http://www.west-wind.com/weblog/posts/246222.aspx

      【讨论】:

      • '最佳' 是轻描淡写 :-)
      • “最佳”到底是什么意思?
      • '不是最优的'只是一个错误的陈述,因为在多线程环境中不可能使用单个DataContext。甚至引用的文章也描述了这一点。
      • @Steven 。你的意思是我们不能在 Web 应用程序中使用静态 DataContext 变量吗?在我的应用程序中,到目前为止,我从未维护过任何线程安全代码之王。请建议我。我的申请即将交付。我正在使用静态数据上下文变量。我该怎么办?
      • @Latit:“我的应用程序即将交付”。不发货!我是认真的。不要!一旦你的应用程序投入生产,它就会严重失败,并且不可信,甚至无法使用。在整个 Web 应用程序中使用单个 DataContext 实例简直是不可能。
      猜你喜欢
      • 2011-04-23
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多