Transaction.Commit не сбрасывает данные в БД в NHibernate - PullRequest
0 голосов
/ 09 декабря 2011

У меня есть метод / модульный тест, в котором есть 2 транзакции.

Объект id, который сохраняется в первой транзакции, используется во второй транзакции. Однако база данных / nhibernate выдает ошибку, что постоянный объект отсутствует и идентификатор недействителен. Однако, глядя на базу данных, это не так, и сущность присутствует.

Почему запрос во второй транзакции не может распознать сущность, сохраненную первой? Второй работает до того, как первый сможет завершить?

Эта проблема возникает очень нерегулярно, но постоянно (примерно один или два раза в неделю) в наших сборках тестов на дым. Однако я не могу воспроизвести эту ошибку на моем локальном компьютере или на сервере, выполнив тесты вручную.

Как мне исследовать / копировать / решить эту проблему?

Спасибо, Sandeep

[править] Вот код теста:

public void UpdateContactMethodConfirmationStatus()
    {
        string workflowId = Guid.NewGuid().ToString();
        try
        {
            Customer customer = null;
            Preference preference = null;

//the first object is persisted here (the AddPreference call has the transaction.commit call
            var preferenceRequest = new AddPreferenceRequest();
            preferenceRequest.Preference = _adminMessageBuilder.CreateDoubleOptInPreference(3);
            using (new TestTimer(TestContext, "CimAdminLoadTest", "AddPreference", workflowId))
                preference = _service.AddPreference(preferenceRequest).Preference;

//the object persisted in above transaction is being used here(preference.id), AddCustomer call also has a transaction.commit
            var request = _messageBuilder.GetAddCustomerRequest("I");
            request.Customer.Preferences.Add(_messageBuilder.AddPreferenceContactMethod(preference.Id));
            using (new TestTimer(TestContext, "CustomerLoadTest", "AddCustomer", workflowId))
                customer = _service.AddCustomer(request).Customer;

            var tenantContext = new TenantContext("CCC", "CCCTEST", "CCM");

            var commPreference = customer.Preferences.Find(x => x.PreferenceId == preference.Id) as CustomerCommunicationPreference;

            var contactMethod = commPreference.ContactMethods[0];

            var key = CustomerPreferenceConfirmationKeyHelper.GenerateCustomerPreferenceConfirmationKey(contactMethod.Id, tenantContext);
            var updateContactMethodConfirmationStatusRequest = new UpdateContactMethodConfirmationStatusRequest()
            {
                Channel = "PEG",
                IsConfirmed = true,
                ShortCode = "123",
                CustomerPreferenceContactMethodKey = key
            };
            using (new TestTimer(TestContext, "CustomerLoadTest", "ResendNotifications", workflowId))
               _service.UpdateContactMethodConfirmationStatus(updateContactMethodConfirmationStatusRequest);
        }
        catch (Exception ex)
        {
            Logger.WriteFailureMessage(ex.Message);
            throw;
        }
    }
...