0

Product クラスを仮定する

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

ここで、次の値を持つ「製品 1」という名前の同じ製品を同時に「要求」する 2 つのクライアントを想定します。

名前 = "商品 1"

価格 = 10

数量在庫 = 100

最初のクライアントは QuantityStock を 110 に増やします

次に、2 番目のクライアントが QuantityStock を 90 に減らします

したがって、最初のクライアントが「110」を更新するのではなく、2 番目のクライアントが元の値「100」から quantityStock を更新するため、この Product の QuantityStock が 10 不足しています ...

元の値 = 100

最初のクライアント更新 100 => 110

2 回目のクライアント更新 100 => 90

どうすればその動作を防ぐことができますか?

注: 私は、リポジトリ パターンとエンタープライズ ライブラリを使用した 3 層アーキテクチャを使用しています。

4

3 に答える 3

2

レコードにタイムスタンプを使用し、レコードをデータベースに送信する前に、レコードのタイムスタンプが変更されていないことを確認します。タイムスタンプが変更された場合、つまり、クライアント 2 がデータを読み取ってからクライアント 1 が送信を実行した場合は、適切なアクションを実行します。

あなたが示した行動について、私はそれを絶対的なものではなく調整にしたいと思うので、システムに在庫を追加または削除しています。そうすれば、競合にそれほど関心がなくなります。

于 2009-04-02T09:59:14.363 に答える
0

このオプションのリストの 4 番を使用します: http://davidhayden.com/blog/dave/archive/2005/10/05/2503.aspx

更新中にタイムスタンプ ( rowversion ) の変更を確認します。

于 2009-04-02T09:56:01.127 に答える
0

この記事を見てください:

SQL Server - オプティミスティック コンカレンシー データベースの更新 - ペシミスティック コンカレンシー - ハイ パフォーマンス ASP.NET Web サイト

また、ここ(記事の最後):

既存の .NET 1.1 SOA ベースの XML Web サービスと連携する .NET 2.0 を使用した次世代スマート クライアントの開発

サンプル:

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 に答える