nhibernate и вложенные транзакции

Я знаю, что nhibernate не поддерживает вложенные транзакции.

Допустим, у меня получилось примерно так:

  1. UserService.BeginTransaction (в текущем сеансе)
  2. UserService.Save
  3. UserService->FeedService
    1. FeedService.BeginTransaction (on current session)
    2. FeedService.Save
    3. FeedService.Commit (для возвращенной транзакции в # 3.1)
  4. UserService->AddressService
    1. AddressService.BeginTransaction (on current session)
    2. AddressService.Save
    3. AddressService.Commit (для возвращенной транзакции в # 4.1)
  5. UserService.Commit (по возвращенной транзакции в # 1)

Что происходит, когда в # 3.3 вызывается фиксация, совершается ли транзакция? Мне нужно все, чтобы добиться успеха или проиграть.


person jgauffin    schedule 20.09.2010    source источник


Ответы (2)


Как сказал Джейми, чтобы избежать этой ситуации, транзакциями следует управлять на более высоком уровне.

Однако, если вы должны сохранить начало / фиксацию на уровне «Служба» по какой-либо причине, вы можете обернуть все в TransactionScope, что вы Complete() только после того, как все пройдет успешно.

person Diego Mijelshon    schedule 21.09.2010
comment
Где вы предлагаете сохранить begin / commit, если не на уровне обслуживания? - person Kugel; 14.09.2012
comment
@Kugel это может быть уровень инфраструктуры, который предоставляет что-то вроде транзакций на запрос или вызов, или оркестратор (например, контроллер) - person Diego Mijelshon; 14.09.2012

да. Вызов BeginTransaction в 3.1 ничего не сделает, потому что уже существует активная транзакция. Если вы хотите, чтобы все ваши операции участвовали в одной транзакции, не вызывайте Begin / End Transaction в 3.x и 4.x.

Мой совет - не использовать транзакции в классах службы или репозитория. Я либо контролирую транзакцию на уровне пользовательского интерфейса, либо создаю класс, инкапсулирующий бизнес-процесс.

person Jamie Ide    schedule 21.09.2010
comment
Он добавляет зависимость NHibernate, что меня устраивает. Наш код пользовательского интерфейса напрямую использует ISession или передает его конструкторам репозитория / фабрики, чтобы несколько репозиториев могли участвовать в транзакции. - person Jamie Ide; 23.09.2010