0

有一段时间,我一直在阅读 NHibernate 中的乐观并发。如果我的理解是正确的,那么下面的示例应该很好。

考虑两个事务 T1 和 T2。

  1. 当 T1 和 T2 同时完成时,状态(DB 条目)将使用最新更新的值进行更新。(T1 或 T2)。

虽然它在概念上似乎是合理的,但为了理解和集成测试,我该如何模拟它。?

有人可以帮我提供一个示例 C# 代码吗?

谢谢 ,

维杰

4

2 回答 2

0

从概念上讲:

  1. 使用 2 个线程执行 T1 和 2;和一个共享锁来同步访问
  2. thread1 获取锁并执行 T1
  3. thread2 获取相同的锁并执行 T2
  4. 其中一项事务将因乐观并发异常而失败
于 2010-03-05T10:55:10.287 回答
0

现在经过大量的谷歌搜索,我找到了一个相当简单的方法来做到这一点。以下是重现这一点的步骤。

  1. 在 Get() 和 Update() 方法之间有一个 Thread.Sleep() ,仅适用于一个用户(进程 1 )。

  2. 当进程 1 正在运行时,启动进程 2,它不会遇到 Thread.Sleep() 并在进程 1 之前完成更新。

  3. 现在进程 2 已经修改了数据库中的数据,现在当进程 1 尝试更新数据时,NHibernate 会抛出一个 stale object 异常。

请参考以下代码片段。

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 回答