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

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

Допустим, я получил что-то вроде этого:

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

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

2 ответа

Решение

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

Тем не менее, если по какой-либо причине вы должны держать начало / коммит на уровне "Сервис", вы можете обернуть все в TransactionScope, который вы будете Complete() только после того, как все получится.

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

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

Другие вопросы по тегам