0

假设产品类

public class Product
{
    public String Name {get;set;}
    public Decimal Price {get;set;}
    public Int32 QuantityStock {get;set;}
}

现在假设两个客户同时“请求”同一个产品,命名为“产品 1”,具有以下值

名称 = “产品 1”

价格 = 10

数量库存 = 100

第一个客户将 QuantityStock 增加到 110

然后第二个客户将 QuantityStock 减少到 90

所以我的这个产品缺少 10 个 QuantityStock,因为第二个客户端从原始值“100”更新了 quantityStock,而不是第一个客户端更新了“110”...

原始值 = 100

第一个客户端更新 100 => 110

第二次客户端更新 100 => 90

我怎样才能防止这种行为?

注意:我处于具有存储库模式和企业库的 3 层架构中。

4

3 回答 3

2

在我将记录提交到数据库之前,我会在记录上使用时间戳并确认记录的时间戳保持不变。如果时间戳已更改,即客户端 1 在客户端 2 读取数据后执行了提交操作,则采取适当的操作。

对于您表示的操作,我很想对其进行调整而不是绝对,因此它要么从系统中增加或减少库存。这样你就不用担心争吵了。

于 2009-04-02T09:59:14.363 回答
0

我会从这个选项列表中选择第四个:http: //davidhayden.com/blog/dave/archive/2005/10/05/2503.aspx

在更新期间检查时间戳 ( rowversion ) 的更改。

于 2009-04-02T09:56:01.127 回答
0

看看这篇文章:

SQL Server - 乐观并发数据库更新 - 悲观并发 - 高性能 ASP.NET 网站

还有这里(在文章末尾):

使用 .NET 2.0 与现有的基于 .NET 1.1 SOA 的 XML Web 服务一起开发下一代智能客户端

样本:

var reader = SqlHelper.ExecuteReader(connectionString,
    "UpdateProduct", product.Name, product.Price, product.StockQuantity);    
if (reader.RecordsAffected > 0)
{
    RefreshEntity(reader, product);
    result = reader.RecordsAffected;
}
else
{
    //must always close the connection
    reader.Close();

    // Concurrency exception
    DBConcurrencyException conflict = 
       new DBConcurrencyException("Concurrency exception");
    conflict.ModifiedRecord = product;

    AssessmentCollection dsrecord;
    // Get record from Datasource
    if (transactionManager != null)
        dsrecord = ProductRepository.Current.GetByName(
        this.transactionManager, product.Name);
    else
        dsrecord = ProductRepository.Current.GetByName(connectionString, 
            product.Name);
    if (dsrecord.Count > 0)
        conflict.DatasourceRecord = dsrecord[0];

    throw conflict;
}
于 2009-04-02T09:59:43.427 回答