【问题标题】:Parallel requests to update the same field in ASP.NET Core using Entity Framework Core使用 Entity Framework Core 更新 ASP.NET Core 中相同字段的并行请求
【发布时间】:2019-10-27 12:30:52
【问题描述】:

我的 Web 应用程序是使用 ASP.NET Core 2.2 和 Pomelo.EntityFrameworkCore.MySql 2.2.0 开发的。在PUT 请求中,我更新了数据库中的一列。下面的代码是我的演示:

[Produces("application/json")]
[Route("api/{id}/increment/{increment}")]
[HttpPut]
public async Task<IActionResult> PutIncrement([FromRoute] int id, [FromRoute] float increment)
{
    Model m = _context.Model
                      .Where(f => f.Id == id)
                      .SingleOrDefault();

    m.Value += increment;

    _context.Entry(m).State = EntityState.Modified;

    await _context.SaveChangesAsync();

    return Ok(m);
}

然后我用 7 个 CPU 并行调用这个相同的请求 (https://localhost/api/1/increment/1) 10 次。我希望该值等于 10。但是,数据库中的实际值远小于 10(大约 2-4)。在 ASP.NET Core 中应该如何处理请求?

【问题讨论】:

  • 你可以实现Optimistic Concurrency --- > 乐观并发假设正在进行的更新将被接受,但在数据库中进行更改之前,记录的原始值与数据库中的现有行进行比较,如果检测到任何更改,则会引发并发异常。
  • 如果您的请求量非常大,您应该使用内存数据库或缓存提供,如 redis。乐观并发不能解决更新字段的问题,如果匹配条件不合适,它会抛出异常。
  • @MuhammadHannan 感谢您的建议。你有什么我可以使用的例子吗?
  • @Bangyou 你可以谷歌一下,那里有很多资源。这个link 可能会帮助您入门。

标签: c# asp.net-core entity-framework-core


【解决方案1】:

你可以实现乐观并发

乐观并发假设所做的更新将被接受,但在数据库中进行更改之前,将记录的原始值与数据库中的现有行进行比较,如果检测到任何更改,并发引发异常。

可以通过添加属性RowVersion来启用,如下图所示

public class Model
{
     public int Id {get;set;}
     ........ // Other Properties
     public int Value {get; set;} 

     [TimeStamp]
     public byte[] RowVersion { get; set; }
}

RowVersion 列将配置为提供自动行版本控制的数据库类型。

现在,您可以将SaveChangesAsync 方法包装在try-catch 中以处理乐观并发问题。更多详情请查看Microsoft docs

try
{
    // business logic
    await _context.SaveChangesAsync();
    // Other business logic
}
catch (DbUpdateConcurrencyException ex)
{
    // your logic to handle optimistic concurrency.
}

【讨论】:

  • 感谢您的建议。正如@MuhammadHannan 提到的,乐观并发不能完全解决我的情况,因为它只会抛出异常,但不能锁定字段并更新。
  • @Bangyou - 在异常块中,您应该再次读取记录并在业务模型更新后尝试保存。请检查我已经在我的答案中发布的链接。
  • 您还可以寻找锁定行的悲观并发;但是不推荐在分布式服务中使用..
猜你喜欢
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2017-05-05
  • 2017-02-11
  • 2019-02-23
  • 2017-09-30
  • 2017-09-17
  • 2022-11-21
相关资源
最近更新 更多