因此,我有多个调用C#方法的ajax请求,除其他外,它检查数据库中的值并将其减少一个。
public SomeModel Get(int id)
...
credit.Available -= 1;
dbContext.SaveChanges();
因此,从理论上讲,每次运行该方法时,可用信用减少一个。但由于它们几乎并行运行,credit.Available
总是相同的,并且只会减少一次,例如,即使它运行5次次。如果数字 20次,则会减少两次。
可以做些什么来解决这个问题?
答案 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)
您可以使用存储过程在获取数据库值的同时更新数据库值。