Многошаговая транзакция базы данных распределена по нескольким HTTP-запросам - PullRequest
6 голосов
/ 12 августа 2011

В прошлом я использовал TransactionScope с настольными клиентскими приложениями для отката незавершенной многошаговой транзакции. Такой подход вряд ли будет работать в веб-приложении.

Может ли кто-нибудь предложить способы, которыми можно обеспечить откат нескольких шагов на нескольких страницах, если весь процесс не завершен? (их браузер падает или закрывается, например, в середине процесса)

Конечно, я мог бы записать во временную таблицу какого-то рода, а затем перенести окончательную запись в реальную таблицу за одну транзакцию, но это может привести к возникновению условий гонки. Я хотел бы начать транзакцию, обслуживать несколько страниц, каждая страница записывает часть транзакции в таблицу (ы), затем завершает транзакцию с фиксацией, и если транзакция не завершена, то она откатывается, когда сеанс заканчивается.

Или я не думаю, что правильно? Предложения?

Поскольку я использую MVC 3, EF 4.1 и Ninject, я не уверен, как это повлияет на решение, но я подумал, что включу эту информацию.

Ответы [ 2 ]

8 голосов
/ 12 августа 2011

Нет транзакций базы данных / TransactionScope на нескольких страницах. Даже пытаться сделать что-то подобное ужасно неправильно.

У вас есть два варианта решения проблемы:

  • Использование Session

    Сохраните ваши данные в сеансе и сохраните их в базе данных, только если пользователь выполнит все шаги и подтвердит сохранение. Это определенно то, что вам нужно.]

  • Использование основы рабочего процесса и длительных транзакций.

    Длительные транзакции не являются транзакциями базы данных - они представляют собой полностью настраиваемое решение, в котором вы должны реализовать компенсацию (откат длительных транзакций) вручную. Вы все еще должны как-то определить, что ваш рабочий процесс должен быть компенсирован, но это не обязательно для вашего решения. Это для решения, где вам нужна «транзакция» для нескольких сессий.

1 голос
/ 12 августа 2011

Вы можете посмотреть на настройку nservicebus или masstransit и использовать их саги.

...