/// <summary> /// Have T1 and T2 read R1, both shall get the result immediately. /// Have T1, T2 both write R2 concurrently, The result shall be correct. Demo locks and two transaction runs concurrently. /// </summary> public void ConcurrentTransactions() { StartUp(); Transaction t1 = WorkflowControl.Start(); Transaction t2 = WorkflowControl.Start(); Assert.AreEqual(WorkflowControl.QueryCar(t1, "Vegas"), WorkflowControl.QueryCar(t2, "Vegas")); AutoResetEvent sync1 = new AutoResetEvent(false); AutoResetEvent sync2 = new AutoResetEvent(false); ThreadPool.QueueUserWorkItem(o => { WorkflowControl.AddCars(t1, "Seattle", 1, 3); WorkflowControl.Commit(t1); sync1.Set(); }); ThreadPool.QueueUserWorkItem(o => { WorkflowControl.AddCars(t2, "Seattle", 2, 3); WorkflowControl.Commit(t2); sync2.Set(); }); // here is just to make sure t2 commits before t1, so the price will be 2. sync1.WaitOne(); sync2.WaitOne(); string actual = PrintCars(); Assert.AreEqual("Vegas,1,3;NewYork,10,30;Seattle,3,3;", actual); }