nhibernate повторите, как управлять сеансом в тупиках - PullRequest
0 голосов
/ 07 июля 2011

У меня проблемы с тупиком.Я работал над некоторыми повторными подходами.Мой повторный код в настоящее время является просто оператором for, который пытается 5 раз.Я понимаю, что мне нужно использовать метод Evit nhibernate для очистки сессии.Я использую фабрику сессий и использую транзакцию для каждого запроса.

В приведенном ниже примере, если при первой попытке я захожу в тупик, будет ли свойство orderNote оставаться таким же во второй попытке?

private ActionResult OrderDetails(int id)
{
    var order = _orderRepository.Get(id);
    order.OrderNote = "will this text remain";

    Retry.Times(5).Do(() => _orderRepository.Update(order));

    return View();
}

Редактировать

1) Трудно отследить причину.Я получаю около 10 блокировок в день по всей моей заявке.Просто настройте профилировщик.Существуют ли другие полезные методы для отслеживания

http://msdn.microsoft.com/en-us/library/ms190465.aspx

Я думаю, что основная проблема заключается в том, что я использую автоинкремент.Я в процессе перехода в Хило.

2) Использование другого режима перехода.Я не определяю ничего в данный момент.Что рекомендуется.

5) Длительные операции.Да.И я думаю, потому что я использую автоматическое увеличение, ленивая загрузка игнорируется.Это звучит правильно?

1 Ответ

3 голосов
/ 07 июля 2011

По-моему, ваш код пытается исправить симптомы вместо причины.

Вам будет лучше делать некоторые из следующих вещей:

  1. Узнайте, почему вы получаете тупики и исправьте основную проблему
  2. Использование другого режима транзакции для чтения прошлых блокировок
  3. Посмотрите, как делегировать обновление в структуру очереди для фоновой обработки.
  4. Понять план выполнения обновления и, возможно, добавить индексирование для ускорения запросов
  5. Есть ли у вас какие-либо "длительные" операции в вашем действии контроллера, которое удерживает транзакцию открытой дольше, чем она должна быть?
  6. Даже если операция завершилась тупиком, почему бы вам не вернуть дружественную ошибку обратно на страницу вызова и позволить им повторить попытку вручную.

Обновление:

1.) Полезные методы для отслеживания

Я использовал этот метод для отслеживания взаимоблокировок, которые должны дать вам представление о ресурсах, находящихся в конфликте: Отслеживание тупиков

Вы также можете посмотреть доступные модели параллелизма: NHibernate Concurrency

2.) Уровни изоляции транзакции

В зависимости от вашей БД этот вопрос содержит некоторую полезную информацию: Режим изоляции транзакций

3.) Длительные операции

Я должен использовать Identity Columns в качестве моих первичных ключей в NHibernate, и я не думаю, что они станут источником вашей проблемы в сценарии обновления, поскольку Id / PK уже установлен этой точкой. Постарайтесь свести к минимуму длительные операции, которые сократят время, в течение которого ваша транзакция остается открытой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...