public virtual void testConcurrentVariableUpdate()
        {
            runtimeService.StartProcessInstanceByKey("testProcess");

            string taskId       = taskService.CreateTaskQuery().First().Id;
            string VariableName = "varName";

            taskService.SetVariable(taskId, VariableName, "someValue");

            SetTaskVariablesThread thread1 = new SetTaskVariablesThread(this, taskId, VariableName, "someString");

            thread1.startAndWaitUntilControlIsReturned();

            // this fails with an optimistic locking exception
            SetTaskVariablesThread thread2 = new SetTaskVariablesThread(this, taskId, VariableName, "someOtherString");

            thread2.startAndWaitUntilControlIsReturned();

            thread1.proceedAndWaitTillDone();
            thread2.proceedAndWaitTillDone();

            Assert.IsNull(thread1.optimisticLockingException);
            Assert.NotNull(thread2.optimisticLockingException);

            // succeeds
            taskService.Complete(taskId);
        }
        public virtual void testConcurrentVariableCreate()
        {
            runtimeService.StartProcessInstanceByKey("testProcess", Collections.SingletonMap <string, object>("varName1", "someValue"));

            string VariableName = "varName";
            string taskId       = taskService.CreateTaskQuery().First().Id;

            SetTaskVariablesThread thread1 = new SetTaskVariablesThread(this, taskId, VariableName, "someString");

            thread1.startAndWaitUntilControlIsReturned();

            // this should Assert.Fail with integrity constraint violation
            SetTaskVariablesThread thread2 = new SetTaskVariablesThread(this, taskId, VariableName, "someString");

            thread2.startAndWaitUntilControlIsReturned();

            thread1.proceedAndWaitTillDone();
            Assert.IsNull(thread1.exception);
            Assert.IsNull(thread1.optimisticLockingException);

            thread2.proceedAndWaitTillDone();
            Assert.NotNull(thread2.exception);
            Assert.IsNull(thread2.optimisticLockingException);

            // should not Assert.Fail with FK violation because one of the variables is not deleted.
            taskService.Complete(taskId);
        }