我有使用LINQ to SQL与SQL Server连接的ASP.NET应用程序。因为我有一个静态类,所以肯定可以在应用程序级别上工作。正如我在此静态类中创建DataContext
静态对象的位置。
除此以外,我没有在应用程序中创建任何数据上下文对象。在我为每个数据库操作使用此静态数据上下文对象的地方。
那么,这将使每个登录用户的事务保持线程安全吗?
最佳答案
注意:以下建议适用于所有实现工作单元模式的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
中所做的更改,因此当您(由于错误)使(cc)无效(由于错误)时,无法恢复此状态(除了创建一个全新的DataContext
)。在这种情况下,您的AppDomain必将失败。
关于c# - 在asp.net中是否可以使用静态LINQ to SQL DataContext维护事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5324147/