0

かなり長い間、 NHibernateの楽観的並行性について読んでいました。私が理解したことが正しければ、以下のサンプルはうまくいくはずです。

2 つのトランザクション T1 と T2 を考えてみましょう。

  1. T1 と T2 が同時に行われると、状態 (DB エントリ) は最新の更新の値で更新されます。(T1 または T2)。

概念的には正しいようですが、理解と統合テストのためにこれをシミュレートするにはどうすればよいですか?

サンプルの C# コードを教えてもらえますか?

ありがとう 、

ビジェイ

4

2 に答える 2

0

多くのグーグル検索の後、私はそれを行うためのかなり簡単な方法を見つけました。これを再現する手順は次のとおりです。

  1. Get() メソッドと Update() メソッドの間に Thread.Sleep() を、1 人のユーザー (プロセス 1 ) に対してのみ配置します。

  2. プロセス 1 が実行されているときに、Thread.Sleep() に遭遇しないプロセス 2 を開始し、プロセス 1 が実行する前に更新を完了します。

  3. プロセス 2 がデータベース内のデータを変更した後、プロセス 1 がデータを更新しようとすると、NHibernate は古いオブジェクト例外をスローします。

次のコード スニペットを参照してください。

public void Update(int empid)
    {
        Employee person = this.dalService.GetByEntityId(empid);
        person.Name = "Process 1";

        // At this point , Update the Person table  manually using raw sql query
        // such as this 'Update Person Set Name = 'Process 2'where empid = @empid;


        // When the update is performed , it is expected to throw the exception , as the in memory data
        // is different from the one in database.
        if (username.equals("Bob"))
        {
            Thread.Sleep(50000);
            // If this is a website, have the above condition, so that it is simulated only for one user.
        }

        this.dalService.Update(person);
    }
于 2010-03-21T04:56:34.863 に答える
0

概念的に:

  1. T1 と 2 を実行するために 2 つのスレッドを使用します。アクセスを同期するための共有ロック
  2. thread1 はロックを取得し、T1 を実行します
  3. thread2 は同じロックを取得し、T2 を実行します
  4. トランザクションの 1 つが楽観的同時実行例外で失敗します
于 2010-03-05T10:55:10.287 に答える