1

我正在创建一个网站,用户可以成为经销商并出售东西,而这笔钱将被添加到那里的信用中。

我正在使用 ASP.net (C#)、Linq-to-SQL 和 SQL Server 2008 R2,我想知道是否会发生某个问题:

我的userinfo桌子是这样的:

ID
username
password
credit
isactive

当用户卖东西时,该Credit列必须添加该产品价格的 99%,我在我的代码中这样做:

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()值发生变化之前,我是否可能不可靠?就像那个用户只是在那么短的时间内出售其他东西一样?creditui.credit

4

1 回答 1

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();

有关并发检查的更多信息,您可以在此处阅读

于 2013-11-01T07:10:57.637 回答