NHibernate(c#)示例中的并发冲突

时间:2010-03-04 11:38:02

标签: c# nhibernate concurrency transactions optimistic-concurrency

很长一段时间,我正在阅读NHibernate中的乐观并发。如果我理解的是正确的,那么下面的样本应该保持良好。

考虑两个交易T1和T2。

  1. 当T1和T2同时完成时,状态(数据库条目)将使用最新更新(T1或T2)的值进行更新。
  2. 虽然它似乎在概念上是合理的,但我如何模拟它以达到理解和集成测试的目的。?

    有人可以帮我提供样本c#代码。?

    谢谢,

    维杰

2 个答案:

答案 0 :(得分:0)

概念上:

  1. 使用2个线程执行T1和2;以及用于同步访问的共享锁
  2. thread1获取锁并执行T1
  3. thread2获取相同的锁并执行T2
  4. 其中一个事务将因Optimistic Concurrency Exception而失败

答案 1 :(得分:0)

现在经过大量的谷歌搜索后,我发现了一种相当简单的方法。以下是重现这一点的步骤。

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

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

  3. 现在进程2修改了数据库中的数据,现在当进程1尝试更新数据时,NHibernate会抛出过时的对象异常。

  4. 请参阅以下代码段。

    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);
        }