我有一个app +网站,它使用API,您可以购买虚拟货币的商品。
当您购买商品时,您可以退款并退款。
下面是一些伪代码来解释。
API /顺序/退款/ {订单ID}
if(order.status == accepted)
{
order.status = refunded;
user.AddMoney(order.Amount);
dbcontext.saveChanges();
}
问题是,如果API像api / order / refund / 21一样被多次调用,它会在saveChanges()之前运行;是成功的将AddMoney();对同一订单不止一次给用户。
有人知道这方面的解决方案吗?
由于
答案 0 :(得分:0)
使用下面示例中的锁
private Object thisLock = new Object();
if(order.status == accepted)
{
lock(thisLock)
{
if(order.status == accepted)
{
order.status = refunded;
user.AddMoney(order.Amount);
dbcontext.saveChanges();
}
}
}
答案 1 :(得分:0)
我最终这样做了:
var vctx = new VenueContext();
using(var dbtransaction = vctx.Database.BeginTransaction(IsolationLevel.RepeatableRead))
{
try
{
var order = vctx.Orders.Include("Venue").Include("Transactions.MenuItem").FirstOrDefault(x => x.Id == orderid);
if (order.StatusId != 1)
{
return false;
}
if (status == 3 || status == 4)
{
vctx = MoneyRepository.AddMoney(order.UserId, order.Total * -1, vctx);
}
order.StatusId = status;
vctx.SaveChanges();
dbtransaction.Commit();
}
catch (Exception)
{
dbtransaction.Rollback();
return false;
}
}
return true;
}
答案 2 :(得分:0)
我以https://github.com/stefanprodan/WebApiThrottle结尾,您可以用它来限制所选端点上的请求量。