很长一段时间,我正在阅读NHibernate中的乐观并发。如果我理解的是正确的,那么下面的样本应该保持良好。
考虑两个交易T1和T2。
虽然它似乎在概念上是合理的,但我如何模拟它以达到理解和集成测试的目的。?
有人可以帮我提供样本c#代码。?
谢谢,
维杰
答案 0 :(得分:0)
概念上:
答案 1 :(得分:0)
现在经过大量的谷歌搜索后,我发现了一种相当简单的方法。以下是重现这一点的步骤。
在Get()和Update()方法之间只有一个用户(进程1)有一个Thread.Sleep()。
当进程1运行时,启动进程2,它不会遇到Thread.Sleep()并在进程1之前完成更新。
现在进程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);
}