有一段时间,我一直在阅读 NHibernate 中的乐观并发。如果我的理解是正确的,那么下面的示例应该很好。
考虑两个事务 T1 和 T2。
- 当 T1 和 T2 同时完成时,状态(DB 条目)将使用最新更新的值进行更新。(T1 或 T2)。
虽然它在概念上似乎是合理的,但为了理解和集成测试,我该如何模拟它。?
有人可以帮我提供一个示例 C# 代码吗?
谢谢 ,
维杰
有一段时间,我一直在阅读 NHibernate 中的乐观并发。如果我的理解是正确的,那么下面的示例应该很好。
考虑两个事务 T1 和 T2。
虽然它在概念上似乎是合理的,但为了理解和集成测试,我该如何模拟它。?
有人可以帮我提供一个示例 C# 代码吗?
谢谢 ,
维杰
从概念上讲:
现在经过大量的谷歌搜索,我找到了一个相当简单的方法来做到这一点。以下是重现这一点的步骤。
在 Get() 和 Update() 方法之间有一个 Thread.Sleep() ,仅适用于一个用户(进程 1 )。
当进程 1 正在运行时,启动进程 2,它不会遇到 Thread.Sleep() 并在进程 1 之前完成更新。
现在进程 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);
}