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

Red*_*wan 1 c# linq asp.net static linq-to-sql

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

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

Ste*_*ven 10

注:以下建议适用于所有O/RM工具实现工作模式的单位,如实体框架的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注定失败.