2

Entity Framework と C# を使用して Web API に取り組んでいます。ダーティリードの解決策が必要です。

以下の方法とトランザクション方法を試しましたが、ダーティリードの解決策が必要です。

ダーティリードまたはファントムリードは、ユーザーが最新のデータを更新していない現象です。

ユーザー A がセールスマンの Web ページを開いたとします。

ユーザー B も同じセールスマンの Web ページを開きました

A はセールスマン ID 1001 をロードし、B も 1001 をロードしました。A はセールスマン名を X に変更して保存しました。

しかし、B には古いデータが表示されており、B がセールスマンの名前を Y に変更すると、A の変更は上書きされます。したがって、B が変更を DB に書き込むのを防ぐ必要があります。

したがって、上記の概念に基づくソリューションが必要です。

using (var transaction = db.Database.BeginTransaction())
{
    try
    {
        db.SaveChanges();
        transaction.Commit();
    }
    catch (Exception excp)
    {
        throw excp;
    }
}

return Ok();

以下は私が試したコードです

using (var transaction = db.Database.BeginTransaction())
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    KSTU_COUNTER_MASTER kcm = new KSTU_COUNTER_MASTER();
    kcm.obj_id = Common.GetNewGUID();
    kcm.company_code = Common.CompanyCode;
    kcm.branch_code = Common.BranchCode;
    kcm.counter_code = c.CounterCode;
    kcm.counter_name = c.CounterName;
    kcm.Maincounter_code = c.MaincounterCode;
    kcm.obj_status = c.ObjectStatus;
    kcm.UpdateOn = Framework.Common.GetDateTime();
    kcm.UniqRowID = Guid.NewGuid();

    db.KSTU_COUNTER_MASTER.Add(kcm);

    try
    {
        db.SaveChanges();
        transaction.Commit();
    }
    catch (Exception excp)
    {
        throw excp;
    }
}

return Ok();
4

1 に答える 1

0

ユーザー A がセールスマンの Web ページを開き、ユーザー B も同じセールスマンの Web ページを開き、A がセールスマン ID 1001 をロードし、B も 1001 をロードしたとします。A はセールスマン名を X に変更して保存しました。

これは、データベース トランザクションではなく、クライアント側のオプティミスティック コンカレンシー チェックを必要とする問題であるというコメントは正しいです。しかし、それがなぜなのかを説明したかったのです。

ここでは、SNAPSHOT、REPEATABLE READ、または SERIALIZABLE 分離レベルで実際にトランザクションを使用できます。A と B はどちらも同じセールスマン ページを開いて編集を実行できますが、最後に保存しようとした方がエラーを引き起こします (分離レベルによっては、このエラーがデッドロックになる可能性があります)。ただし、上書き書き込み異常は防止されます。

ただし、それを機能させるには、データベース接続を維持し、各ユーザーが「セールスマン Web ページ」に移動してからユーザーがデータを保存するまでトランザクションを開いたままにする必要があります。また、Web アプリケーションでは、その長さに関する情報や制御はありません。クライアント サーバー アプリケーションでは、これをある程度機能させることができますが、Web アプリでは、クライアント側の楽観的同時実行を支持して、このアプローチはほぼ例外なく放棄されました。

于 2019-08-07T12:10:02.677 に答える