当我使用 EF(和 WebAPI)向数据上下文发送高频请求时出现奇怪的竞争条件

2024-06-21

在我的 WebAPI 控制器中我有这个:

   [HttpDelete]
    public HttpResponseMessage DeleteFolder(int id)
    {
        _service.DeleteFolder(id);
        return Request.CreateResponse(HttpStatusCode.OK, "Deleted");
    }

_service 是使用 _db 的数据库访问服务 - 我的项目 DbContext 的实例,在服务类的构造函数中定义一次。

在我的客户端中,我使用 for 循环向删除方法发送一堆异步 AJAX 调用,尝试连续删除多个文件夹。这时候就会出现这样的事情:

和这个:

开始发生。我有一种感觉,这是由于竞争条件造成的,但我不知道如何解决它,如果是这样的话。我应该为每次调用创建一个新的 dbcontext 实例吗?如果是这样,应该在哪里创建它?在repository.cs的每个方法中(为每个方法的使用创建一个dbContext)?

任何帮助将非常感激。


是的,每次调用都需要一个单独的 DbContext。来自docs http://msdn.microsoft.com/en-us/library/system.data.entity.dbcontext(v=vs.103).aspx;

此类型的任何公共静态(在 Visual Basic 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。

您可以做的(例如,取决于您如何使用事务)是使用工作单元 http://msdn.microsoft.com/en-us/magazine/dd882510.aspx模式,如果 EF 的情况基本上意味着包装你的DbContext在一个类中(您不希望它将 EF 特定类(如 DbContext)暴露给您的业务类),以便您在应用程序代码(或者,取决于分层、业务代码)中可以编写类似的内容;

[HttpDelete]
public HttpResponseMessage DeleteFolder(int id)
{
    using(var uow = new UnitOfWork()) {  // Creates a new DbContext
        _service.DeleteFolder(uow, id);
        uow.Commit();          
        return Request.CreateResponse(HttpStatusCode.OK, "Deleted");
    }                                    // Uncommitted UoW rolls back on Dispose
}                                        // ie on unhandled exceptions.

...或者如果您认为通过每个服务/存储库方法传递 UoW 很烦人(我确实如此),您可以让 UnitOfWOrk 构造函数将其保存为“当前活动的工作单元”HttpContext.Current.Items,以便任何服务/存储库都可以在需要时获取当前的工作单元。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我使用 EF(和 WebAPI)向数据上下文发送高频请求时出现奇怪的竞争条件 的相关文章

  • Laravel csrf 令牌与 ajax POST 请求不匹配

    我正在尝试通过ajax从数据库中删除数据 HTML foreach a as lis some code a href class delteadd Delete a click action perform on this link en
  • 如何让按钮执行php脚本?

    如何让 html 按钮执行 php 脚本 我正在开发一个登录系统 其中只有一个用户可以登录 每当其他用户尝试登录时 它应该给他们弹出警告消息 another user is already logged in Do you want to
  • 我可以将 Entity Framework 6 与 Visual Studio 2010 一起使用吗?

    我们的开发团队 和构建服务器 成功地将 Visual Studio 2010 和 Visual Studio 2012 混合用于我们的应用程序 然而 自从从 EF5 升级到 EF6 后 我们似乎不再能够使用 VS2010 进行构建 具体来说
  • 如何修改 PHP/Jquery/Ajax 脚本以拥有多个表单字段

    我有一个 php Ajax Jquery 脚本 它将表单字段插入 MySQL 并更新页面 当您点击提交时无需刷新 我希望脚本提交四个表单字段 而不是仅一个 我已经更新了数据库表add delete record还有 3 个附加字段 余额 帐
  • .trigger 函数的回调

    我有以下代码 scheduleLink trigger click alert text 这是点击处理程序 scheduleLink bind click function loadScheduleEvent wrap tabs find
  • MySql + 实体框架 = 每个派生表必须有自己的别名

    我必须从我的 C 程序访问另一个开发人员的一些 MySql 视图 因此 经过一番搜索后 我决定使用实体框架 并使用这个问题中提到的驱动程序 将 MySQL 与实体框架结合使用 https stackoverflow com question
  • 实体框架 6 - 查询性能

    我使用 Entity Framework 6 目前有一个包含许多包含的查询 它将大约 1200 个实体加载到 dbContext 中 加载实体似乎相当慢 因为查询需要几乎一分钟的时间 对于表演我能做些什么吗 我有 4 个这样的查询需要 2
  • 使用请求登录具有 javascript 登录表单的网站

    首先我要说的是我的编程经验很少 在过去几天尝试编写这个程序时 我学到了很多东西 我正在 Windows 7 上使用 PyCharm requests Beautiful Soup 和 lxml 运行 Python 2 7 我正在尝试从一个严
  • json_encode 不使用 html 字符串作为值

    我现在正在调试这个ajax很长一段时间 我的 jQUery 文件中有这个 typeForm ajaxForm success function html alert html submit 这调用服务 php 其中我有这个 data arr
  • 跨浏览器AJAX功能动态加载HTML

    我正在寻找一个 AJAX 函数来动态请求 HTML 页面 我已经找到以下内容 function ajaxinclude url var page request false if window XMLHttpRequest if Mozil
  • Laravel 中无效后防止重定向到主页

    我正在使用 Laravel 5 3 开发 RESTful API 因此我正在使用我的控制器测试一些功能和请求 我需要做的一件事是在数据库中添加字段之前验证用户发送的请求 因此 我使用自定义 FormRequest 来验证它 当我在 Post
  • 使用 jQuery 异步加载图像

    我想使用 jQuery 在我的页面上异步加载外部图像我尝试过以下方法 ajax url http somedomain com image jpg timeout 5000 success function error function r
  • 仅 LINQ to Entities 中的排序输入支持“Skip”方法。必须在方法“Skip”之前调用方法“OrderBy”

    Using 实体框架6 0 2 and NET 4 5 1 in Visual Studio 2013 更新 1 with a DbContext连接到 SQL Server 我有一个很长的过滤器链 我正在根据调用者的期望结果将其应用于查询
  • 在添加 ApiController 属性之前,ASP.NET Core 3.1 无法处理 Axios 请求

    我有以下问题 每当我向 Api 端点发送内容时 ASP NET Core 3 1 就无法处理该请求 但是 当我添加ApiController属性它工作得很好 我的代码是正确的 但只有当我添加此属性时才有效 怎么会这样呢 作为参考 这是我的代
  • 提交ajax表单并停留在同一页面不起作用

    我想将用户的评论存储在我的数据库中 当用户提交时 我不想将他们重定向到新页面 我有以下代码 但它不起作用 我的 HTML 代码
  • 如何获取 XML 文档的innerHTML(AJAX)?

    AJAX 查询后 返回一个 XML 文件 我能够 解析 该文件 但是当涉及到获取元素的 innerHTML 或在本例中为 innerXML 时 问题就出现了 如果 XML 元素 比方说 内容 仅包含我可以执行的操作 content chil
  • Ajax 加载并淡入

    我正在尝试使用 ajax 在 html 中加载淡入淡出 它加载但没有褪色 我不知道我做错了什么 这是我的代码 artworks click function load artworks page content load artworks
  • 设置域实体的身份

    域中的所有实体都需要具有身份 通过继承自DomainEntity 我能够为类提供身份 城市域实体 为了方便阅读而进行了精简 public class City DomainEntity IAggregateRoot public strin
  • 使用 XML 文档部署 Web API 项目时,构建服务器上“访问被拒绝”

    为了使用 Web API 帮助页面为我的 Web API 项目生成 XML 文档 我必须检查项目属性的 构建 部分下的 XML 文档文件 选项 当我在本地构建时 这会正确生成文档 但是 当我签入时 我在构建服务器上收到以下错误 CSC 生成
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat

随机推荐