异步请求同时命中数据库的解决方案

本文关键字:数据库 解决方案 请求 异步 | 更新日期: 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();
    }

锁定的对象必须是静态的,并且不属于任何实例。这样,多个线程必须为同一个锁运行,因此不会交错执行。

可以使用存储过程在获取数据库值的同时更新数据库值。