【发布时间】: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