我用linq to sql的时候,如果我正在进行数据操作,而另一个人对数据库进行改变的时候,会出现数据已经改变的异常,我应该怎么处理。 举个例子,我要减少数据库中产品的数量,但我不能让他的库存小于零,所以我要先去判断,如果大于零的时候我才提交改变,而在我判断的时候,发现数据库手动改变产品数量时,这里并不会减少我查询的产品的数量,提交改变也会报异常。我应该怎么处理。。
------最佳解决方案--------------------------------------------------------
使用 Linq时,Linq会把数据库的数据缓存到实体对象中,在做更新操作时,Linq会默认把除更新字段外的所有字段,作为Update语句中的Where条件(这个可以加断点调试查询Linq的UPdate语句)。如果此时有另外的程序,在访问数据库,并修改数据库数据的时候,此时Linq缓存起来的数据和实际数据库中的数据产生了不一致的情况。但是Linq仍然把被修改过的字段,作为Update的Where条件,由于数据库中的某个字段的数据被修改了,所以Where条件始终匹配不到原有的数据,这时,就会抛出所谓的:“System.Data.Linq.ChangeConflictException: Row not found or changed.”异常。
产生此异常,主要是Linq缓存数据和实际数据库数据不一致的情况造成。解决次问题的情况:
[code=csharp]
try {
db.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
}
catch (System.Data.Linq.ChangeConflictException ex)
{
foreach (System.Data.Linq.ObjectChangeConflict occ in db.ChangeConflicts)
{
//以下是解决冲突的三种方法,选一种即可
//使用当前数据库中的值,覆盖Linq缓存中实体对象的值
occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);
//使用Linq缓存中实体对象的值,覆盖当前数据库中的值
occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);
//只更新实体对象中改变的字段的值,其他的保留不变
occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);
}
db.SubmitChanges();
}code]
------其他解决方案--------------------------------------------------------
查transaction/SELECT FROM TABLE WITH (TABLOCKX)
这是个比较复杂的事情,要谨慎一点
------其他解决方案--------------------------------------------------------