nhibernate и вложенные транзакции
Я знаю, что nhibernate не поддерживает вложенные транзакции.
Допустим, я получил что-то вроде этого:
- UserService.BeginTransaction (в текущем сеансе)
- UserService.Save
- UserService-> FeedService
- FeedService.BeginTransaction (в текущем сеансе)
- FeedService.Save
- FeedService.Commit (для возвращенной транзакции в # 3.1)
- UserService-> AddressService
- AddressService.BeginTransaction (в текущем сеансе)
- AddressService.Save
- AddressService.Commit (для возвращенной транзакции в # 4.1)
- UserService.Commit (для возвращенной транзакции в #1)
Что происходит, когда commit вызывается в #3.3, транзакция совершается? Мне нужно все, чтобы преуспеть или потерпеть неудачу.
2 ответа
Как сказал Джейми, транзакции должны управляться на более высоком уровне, чтобы избежать этой ситуации.
Тем не менее, если по какой-либо причине вы должны держать начало / коммит на уровне "Сервис", вы можете обернуть все в TransactionScope
, который вы будете Complete()
только после того, как все получится.
Да. Вызов BeginTransaction в 3.1 ничего не сделает, потому что уже есть активная транзакция. Если вы хотите, чтобы все ваши операции участвовали в одной и той же транзакции, не вызывайте Begin/End Transaction в 3.x и 4.x.
Мой совет - не использовать транзакции в классах обслуживания или репозитория. Я либо управляю транзакцией на уровне пользовательского интерфейса, либо создаю класс, который инкапсулирует бизнес-процесс.