Хобрук: Ваш путь к мастерству в программировании

Сеанс / транзакция NHibernate на запрос, предотвращающий множественные вставки

Проект MVC 3, над которым я работаю, фиксирует / откатывает все вызовы вставки / обновления, которые я делаю в конце текущего сеанса. Это отлично работает в большинстве случаев, за исключением того момента, когда я делаю несколько вставок.

Когда CSV загружается на сайт, каждая запись анализируется и вставляется в БД. Проблема в том, что если одна запись не может быть вставлена, все предыдущие записи откатываются, и все последующие попытки завершаются ошибкой:

    don't flush the Session after an exception occurs

Как я могу отключить запрос на сеанс (или мне нужно как-то «перезапустить» транзакцию)?

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

Сеанс для каждого запроса настраивается в классе, который реализует IHttpModule. Этот класс принимает контекст HttpApplication и класс UnitOfWork. Здесь происходят коммиты и откаты.

Упомянутый выше UnitOfWork вводится в репозитории с помощью StructureMap.

Как я уже сказал, такое поведение подходит для 99% остальной части сайта, мне просто нужно получить это массовое обновление, чтобы игнорировать транзакции сеанса на запрос. Или мне нужно вручную перезапускать транзакцию для каждой новой записи. Я просто не знаю как.


  • Это не автоматическое поведение, где-то вы должны перехватить исключение и откатить сеанс. Не могли бы вы взглянуть на Global.asax? 19.07.2012
  • Я добавил больше деталей выше. 19.07.2012
  • Можете ли вы получить экземпляр текущего сеанса? Если это так, вы можете использовать его для создания новой транзакции и using попытаться выполнить предварительное обновление. Окружите его попыткой / уловом, чтобы исключение не было перехвачено HttpModule, и все в порядке. 19.07.2012
  • Если это исключение HibernateException, вы должны отказаться от ISession. Кроме того, кажется немного странным, что вы хотите разрешить частичный импорт csv ... но если вам действительно нужно, я бы просто получил свежий ISession прямо из SessionFactory и избегал сеанса с областью запроса . 19.07.2012
  • Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он (1) был вызван проблемой, которая больше не может быть воспроизведена, (2) нет ответа от спрашивающего, который последний раз был активен в 2014 году, (3) не принял ни полезных ответов. 04.12.2017
  • Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он (1) был вызван проблемой, которая больше не может быть воспроизведена, (2) нет ответа от спрашивающего, который последний раз был активен в 2014 году, (3) не принял ни полезных ответов. 08.07.2018

Ответы:


1

ISession имеет свойство FlushMode со значением по умолчанию Auto,

Авто. ISession иногда сбрасывается перед выполнением запроса, чтобы гарантировать, что запросы никогда не возвращают устаревшее состояние. Это режим промывки по умолчанию.

Фиксация ISession сбрасывается при вызове Transaction.Commit ()

Никогда ISession никогда не сбрасывается, если приложение явно не вызывает Flush (). Этот режим очень эффективен для транзакций только для чтения.

Не указано. Специальное значение для неопределенного режима очистки.

Всегда ISession сбрасывается перед каждым запросом. Это почти всегда не нужно и неэффективно.

Попробуйте изменить свойство ISession's FlushMode на значение Commit.

19.07.2012

2

Сеанс для каждого запроса настраивается в классе, который реализует IHttpModule.

Этот запрос сеанса на каждый запрос, который вы запускаете в HttpModule, - это то, что делаете вы, а не NHibernate. Как его отключить, зависит от вашего кода. Мне лично не нравится абстрагировать NHibernate в каком-то UnitOfWork-классе, потому что теперь вы понимаете, что используемая вами абстракция недостаточно хороша, и грязный взлом, вероятно, является единственным выходом.

На самом деле вы хотели бы (и не рекомендуется) делать следующее:

foreach (var row in rows)
{
    using (var session = SessionFactory.OpenSession())
    using (var tx = session.BeginTransaction())
    {
         var whatever = ...
         session.Save(whatever);
         tx.Commit();
    }
}
25.07.2012
Новые материалы

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

Ториго  — революция в игре Го
Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

Математика и интуиция - Часть 1
У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..