2013-11-01 41 views
1

我正在创建一个网站,用户可以成为经销商和销售的东西,并把钱添加到那里信用。数据有可能以这种方式变化吗?

我使用ASP.net(C#),LINQ到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(); 

个我的问题:

难道我已经从数据库和之前在数据库中的更改db.submitchanges()credit列中提取UI纪录之后我ui.credit将不可靠?就像那个用户在短时间内只卖其他东西一样?

+2

http://msdn.microsoft.com/en-us/library/vstudio/bb738618(v=vs.100).aspx –

+0

@ ta.speot.do你知道如果你有多台服务器,它的行为如何?实体框架不在数据库级别或代码中处理它吗? – nunespascal

回答

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

+0

多数民众赞成多数民众赞成在此回答 – user2944052

+0

只是一件事情,因为这个行事发生两个交易(在这种情况下的产品销售)必须非常接近, 我的意思是两个不同的销售发生不到一秒钟彼此,对? – user2944052

+0

请参阅,这是您必须根据应用使用频率做出的决定。我的意思是,不是保存日期时间,而是可以有一个DateTimeStamp,它包括日,年,月,小时,分钟,秒(如果你愿意的话,毫秒),所以它看起来像011201311011354333。这样的数字是总是会是独一无二的(再次,根据使用频率) –

相关问题