我正在创建一个网站,用户可以成为经销商并销售商品,并将资金添加到信用卡中。
我正在使用ASP.net(C#),Linq-to-SQL和SQL Server 2008 R2,我想知道是否会发生某个问题:
我的userinfo
表是这样的:
ID
username
password
credit
isactive
当用户出售某些内容时,必须使用该产品价格的99%添加Credit
列,并在我的代码中执行此操作:
PayDBDataContext db = new PayDBDataContext(ConnectionStrings.ConnectionString);
UserInfo ui = db.UserInfos.SingleOrDefault(x => x.ID == userID);
if(ui.isactive==false)
return;
int p= (int)(newSell.Price*0.99);
//---and maybe some other more time consuming calculations
ui.credit+=p;
db.SubmitChanges();
db.Connection.Close();
我的问题:
在我从数据库中提取UI记录之后,在数据库更改db.submitchanges()
列的credit
值之前和我的ui.credit
不可靠之后,是否有可能?就好像那个用户只是在那么短的时间内卖掉别的东西一样?
答案 0 :(得分:2)
完全有可能,您获取了一条记录并基于某个字段的值,您开始计算,在您保存之前,您提取的记录在数据库中已更改。它一直在发生或很可能发生。
您需要注意的是并发检查。实现并发检查的最简单方法是在数据库中为每一行保留一个DateTime标记,即将表修改为:
ID
username
password
credit
isactive
dateModified
现在当您获取记录时,您还有dateModified字段,因此,在执行db.SubmitChanges()
之前,您再次调用数据库以获取相同记录,并查看现在返回的dateModified是否等于您之前检索过,如果没有,则存在并发冲突,生成错误消息,即
PayDBDataContext db = new PayDBDataContext(ConnectionStrings.ConnectionString);
UserInfo ui = db.UserInfos.SingleOrDefault(x => x.ID == userID);
if(ui.isactive==false)
return;
int p= (int)(newSell.Price*0.99);
//---and maybe some other more time consuming calculations
ui.credit+=p;
UserInfo uiCon =db.UserInfos.SingleOrDefault(x=>x.ID==userID);
if(uiCon.dateModified != ui.dateModified)
{
//generate validation error and ask the user to reperform calculations
return;
}
db.SubmitChanges();
db.Connection.Close();
更多关于concurreny检查,你可以阅读here