Вопрос

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

Допустим, я получил что-то подобное:

  1. Userservice.begintransaction (на текущей сессии)
  2. Userservice.save.
  3. Пользователиervice-> 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, передается транзакция? Мне нужно все, чтобы преуспеть, либо потерпеть неудачу.

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

Решение

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

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

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

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

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

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