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

时间:2016-02-12 14:29:58

标签: c# asp.net-mvc asynchronous

因此,我有多个调用C#方法的ajax请求,除其他外,它检查数据库中的值并将其减少一个。

public SomeModel Get(int id)
     ...
     credit.Available -= 1;
     dbContext.SaveChanges();

因此,从理论上讲,每次运行该方法时,可用信用减少一个。但由于它们几乎并行运行,credit.Available总是相同的,并且只会减少一次,例如,即使它运行5次次。如果数字 20次,则会减少两次

可以做些什么来解决这个问题?

3 个答案:

答案 0 :(得分:1)

我建议使用原始SQL或SQL存储过程来完成工作。像这样:

UPDATE tbl
SET Balance = Balance - 1
WHERE id = @id

如果您使用的是Entity Framework,可以使用以下方法调用它:

var sql = "UPDATE tbl SET Balance = Balance - 1 WHERE id = @id";
dbContext.ExecuteSqlCommand(sql, id);

答案 1 :(得分:0)

您可以锁定关键部分:

private static readonly object o = new Object();

public SomeModel Get(int id)

    lock (o)
    {
        ...
        credit.Availbale -= 1;
        dbContext.SaveChanges();
    }

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

答案 2 :(得分:0)

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