数据是否可能以这种方式发生变化?

时间:2013-11-01 07:05:13

标签: c# asp.net sql-server-2008 iis linq-to-sql

我正在创建一个网站,用户可以成为经销商并销售商品,并将资金添加到信用卡中。

我正在使用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不可靠之后,是否有可能?就好像那个用户只是在那么短的时间内卖掉别的东西一样?

1 个答案:

答案 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