电商下订单的时候,需要对库存进行判断,然后进行库存操作,但是更新库存的时候,数量多的时候,保存可能已经被更改,所以要处理下。
1-使用的是sqlserver,数据库增加timestamp字段,每次更新都会变化,用来判断是否数据更改
2-在EF中添加模型,右键点在模型浏览器中显示,展开字段,找到timestamp右键点属性
3-更改并发模式为fixed
4-以下是代码,参考了官方文档
官方文档
using (var db = new REBPEntities())
{
var stock = db.PStocks.Where(x=>true).FirstOrDefault();
bool saveFailed;
do
{
saveFailed = false;
try
{
var enableStock = stock.Stock - stock.LockStock;
stock.EnableStock = stock.EnableStock - 1;
stock.LockStock = stock.LockStock+ 1;
//如果保存数据的时候,数据被更改,则执行异常里的方法,重新加载数据
db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
saveFailed = true;
ex.Entries.Single().Reload();
//重新获取数据,如果库存小于1,则抛出异常
if (stock.EnableStock<1)
{
saveFailed = false;
throw new Exception("无库存");
}
}
} while (saveFailed);
}