是否可以在asp.net中使用静态LINQ to SQL DataContext维护事务?

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

那么这会将事务维护为每个登录用户的线程安全吗?

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

LINQ to SQL DataContext不是线程安全的。 您应该为每个Web请求创建(至少)1个上下文。 在多个线程上重用相同的实例意味着一个线程可以调用SubmitChanges而另一个线程仍在插入新对象。 如果幸运的话, DataContext将抛出exception,因为它无法保留更改。 如果你运气不好, DataContext成功,你就会破坏单个请求的primefaces性,这会导致数据库中的数据不一致。 换句话说:你将拥有一个充满狗屎的数据库!

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

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