异步请求同时命中数据库的解决方案
本文关键字:数据库 解决方案 请求 异步 | 更新日期: 2023-09-27 18:34:25
因此,我有多个调用 C# 方法的 ajax 请求,该方法检查数据库中的值并将其减少 1。
public SomeModel Get(int id)
...
credit.Available -= 1;
dbContext.SaveChanges();
因此,从理论上讲,每次运行该方法时,可用的信用额度都会减少 1。但是由于它们几乎并行运行,因此credit.Available
始终相同,并且仅减少一次,例如,即使运行了 5 次。如果这个数字是 20 倍,它会减少两次。
可以做些什么来解决这个问题?
我建议使用原始SQL或SQL存储过程来完成这项工作。 像这样:
UPDATE tbl
SET Balance = Balance - 1
WHERE id = @id
如果您使用的是实体框架,则可以使用以下方法调用它:
var sql = "UPDATE tbl SET Balance = Balance - 1 WHERE id = @id";
dbContext.ExecuteSqlCommand(sql, id);
您可以锁定关键部分:
private static readonly object o = new Object();
public SomeModel Get(int id)
lock (o)
{
...
credit.Availbale -= 1;
dbContext.SaveChanges();
}
锁定的对象必须是静态的,并且不属于任何实例。这样,多个线程必须为同一个锁运行,因此不会交错执行。
可以使用存储过程在获取数据库值的同时更新数据库值。