Как совершить и начать новую транзакцию в рамках одного запроса? - PullRequest
0 голосов
/ 18 декабря 2009

Я использую шаблон репозитория в nhibernate. В приложении asp.net MVC. У меня есть httpmodule, который:

beginRequest it calls session.beginTransaction();
EndRequest it calls session.Transaction.Commit();

Это нормально для 95% времени.

У меня есть случай, когда мне нужно сделать следующее в одном запросе:

List<User> users = factory.getUsers();

// update users

// commit transaction

// load users from the db again

Должен ли я просто позвонить:

factory.Session.Transaction.Commit();
factory.Session.BeginTransaction();

Я знаю, что это одна из причин, почему против использования шаблона репозитория и начала / конца сеанса в HttpModule, но в любом случае именно так я и делаю:)

Какие у меня варианты?

Uptate Так что в основном у меня теперь будет:

Запрос страницы будет выглядеть так:

BeginRequest:  Session.BeginTransaction();

userlist.aspx:   
               // code to fetch users from the db
               // update users
               Session.Transaction.Commit();
               Session.BeginTransaction();
               // code to fetch recently commited users form db

EndRequest:    Session.Transaction.Commit();

Вышеупомянутое кажется правильным?

Полагаю, мне следует сначала проверить, существует ли текущая транзакция, прежде чем вызывать commit, и начать снова?

1 Ответ

1 голос
/ 18 декабря 2009

У вас есть две части логики

List<User> users = factory.getUsers();

// update users

и

load users

и вы хотите, чтобы они были в отдельных транзакциях. Таким образом, вы добавляете соответствующие Запуски и коммиты. Это работает, где проблема?

с началом / окончанием сеанса в HttpModule, но в любом случае, вот как я делаю :) Какие у меня варианты?

Смысл обсуждения, иметь ли начало сеанса в HttpModule? Ну, ваши варианты это не делать! У вас есть блок логики (замечательно, здесь очень простая логика), потенциально его можно использовать повторно, поэтому перенесите его в свой собственный класс. Как вы думаете, лучше иметь

код клиента:

  useSomeLogic() // bzzzt forgot to start session

  startSession()
  useSomeLogic()  // ok thank you, I can work, but please remember to commit
  commit()

Или

  useSomeLogic() // just fine, I'll start the session and do you work for you and commit

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...