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

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

我有使用LINQ to SQL与SQL Server连接的ASP.NET应用程序。因为我有一个静态类,所以肯定可以在应用程序级别上工作。正如我在此静态类中创建DataContext静态对象的位置。
除此以外,我没有在应用程序中创建任何数据上下文对象。在我为每个数据库操作使用此静态数据上下文对象的地方。

那么,这将使每个登录用户的事务保持线程安全吗?

最佳答案

注意:以下建议适用于所有实现工作单元模式的O / RM工具,例如Entity Framework的ObjectContextDbContext,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/

相关文章:

c# - nopCommerce IProductService 返回 IList 而不是 IQueryable

C# 定时调用函数

c# - 获取子列表上有条件的列表

c# - 为什么我的模拟列表没有删除某个元素?

.net - 为什么 List(Of T) 没有 Count()?

java - 安卓蓝牙错误133

c# - 抛出异常停止进程

asp.net - 如何在 Entity Framework Core 2.1 中播种枚举

asp.net - 仅用于电话号码和分机的正则表达式

c# - 在 json 字符串中序列化 session 对象