Вопрос

Я пытаюсь добиться своего рода вложенного поведения транзакций, используя параметры управления транзакцией NhiberNate и параметров проблемы, но все получилось немного запутанным после слишком большого числа, поэтому любое подтверждение по поводу перечисления фактов, которые ниже будет очень полезным.

То, что я хочу, - это открыть одну большую транзакцию, которая разбивается в небольших транзакциях. Представьте себе следующий сценарий:

  • TX1 открывает TX и вставляет запись человека;
  • TX2 открывает TX и обновляет имя этого человека к P2;
  • TX2 совершает;
  • TX3 открывает TX и обновляет имя этого человека к P3;
  • Откаты Tx3;
  • TX1 совершает;

Я хотел бы увидеть NH, отправляя вставку и обновление TX2 в базу данных, просто игнорируя то, что TX3, так как он откатился назад.

Я попытался использовать FlushMode = никогда и только промыть сеанс после того, как правильное началось / коммиты / откаты были востребованы, но NH всегда обновляет базу данных с окончательным состоянием объекта, независимо от коммиентов и откатов. Это нормально? Неужели NH действительно игнорирует транзакционный контроль при работе с FlushMode = никогда?

Я также пытался использовать FlushMode = Commit и открывать вложенные транзакции, но я обнаружил, что, поскольку ADO.NET, вложенные транзакции, на самом деле, всегда та же транзакция.

Обратите внимание, что я не пытаюсь достичь поведения «все или ничего». Я ищу больше до северокого пути работы. Есть ли способ сделать это (SavePoints) с NH?

Заранее спасибо.

Филипе

Это было полезно?

Решение

Просто чтобы не покидать этот вопрос открытым навсегда, я опубликую решение, которое мы приняли.

У нас есть единица работы, такая как контейнер, который управляет вложенным поведением транзакций. В зависимости от того, что мы хотим, оно создает (или нет) новых сессий. На примере:

  • Продолжайте по ошибке: если мы хотим, чтобы, даже если по ошибке транзакции другие совершают, что контейнер UOW использует разные сеансы для каждой «транзакции» и промывают каждый TX в конце своей работы;
  • Откат по ошибке: если мы хотим, чтобы на сеансовом откату (из-за ошибки или отката бизнеса) каждая другая транзакция возвращается назад, контейнер UOW использует тот же сеанс для всех вложенных транзакций и откатывает всех в конце.

Важно сказать, что «транзакция», что это UOW манипулирует не транзакция NH (ADO.NET) напрямую. Мы создали абстракцию транзакции, поэтому код манипуляции «голосует», если наша транзакция может быть зачислена или откатывается назад, но реальное действие только что происходит в конце всего, основанной на выбранной стратегии ошибки.

Мы знаем, что это использование не очень распространено и только вписывается только на конкретные сценарии (в нашем случае это сценарий интеграции с пакетной обработкой), поэтому я буду сейчас почтить код. Если кто-то думает, что эта реализация может помочь, пожалуйста, пришлите мне сообщение, и я буду рад поделиться кодом.

С уважением,

Филипе

Другие советы

Nibernate не поддерживает вложенные транзакции. Каждая сессия может иметь не более одной активной транзакции. Я не уверен, что вы пытаетесь достичь, потому что ваш пример сценария не имеет смысла для меня. Задача транзакции 1 после того, как вставка будет иметь тот же эффект.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top