7

Muszę być całą moją aplikacją transakcyjną na każde przetwarzane przez nią żądanie internetowe.W jaki sposób mogę utworzyć bezpieczną transakcję na żądanie internetowe w MVC .net?

Potrzebuję transakcji, aby rozpocząć, a jeśli nie było żadnych wyjątków w kontrolerach, zatwierdź ją. W przeciwnym razie cofnij.

tej pory mam następujący realizacji:

  • pierwszy, utworzyć transakcję na kontrolerze jako zależność.
  • Następnie robię mój kontroler/usługę/repozytoria/inne rzeczy pracujące.
  • I wreszcie główna abstrakcyjna klasa kontrolera wykonuje swoją metodę OnActionExecuted, w której albo ją zatwierdzam, albo nie.

Tu idzie listę technologii, które używam:

  • MVC 4
  • Ninject
  • Automapper
  • wzór Obsługi

Teraz, czego chcę wiedzieć, co z zakleszczenia? Co się stanie, gdy dwa żądania sieciowe zostaną przetworzone, a ponadto uzyskają prawo do pracy z dwoma repozytoriami (które są powiązane z ich instancjami), a co oznacza, dwiema tabelami w bazie danych?

Na przykład: jeden wniosek na początku chce czytać stół Table1 a następnie Table2, w międzyczasie druga prośba chce pracować z Table2 a następnie Table1.

Co należy zrobić?

+0

Będę odpowiadać jako komentarz, ponieważ zakres mojej odpowiedzi (i myślę, że twoje pytania) wymaga znacznie więcej niż odpowiedzi na WR. IMO musisz oddzielić obawy związane z prezentacją od "domeny" (lub logiki biznesowej). Taka architektura daje dwie zalety: a) zdolność do aranżowania wykonania poszczególnych pod-składników logicznych i ich udziału (lub nie) w transakcji kontrolowanej przez MS, oraz b) infrastrukturę kodu, która znacznie lepiej nadaje się do implementacji jakiejś formy niestandardowej transakcji lub w kolejce, jeśli nieszablonowe narzędzia i najlepsze praktyki są niewystarczające ze względu na specyfikę Twojej aplikacji –

Odpowiedz

0

Dobra, ja sobie sprawę, pewne rozwiązania na pytanie:

  • Pierwszą z nich jest lista wszystkich tabel i dostęp do nich za pomocą tej listy. Tak więc, testowany Table2 nigdy nie będzie dostępny przed Table1, jeśli oba są wymagane przez kontekst, a zakleszczenie nie nastąpi.

  • Druga polega na stworzeniu systemu Lazy-IO, który śledzi wszystkie niezbędne zmiany (np. Dodawanie elementów, pobieranie identyfikatora i używanie go w innym miejscu). Ale wydaje się dość trudne do zbudowania.

  • Innym podejściem jest tworzenie blokad na poziomie aplikacji dla każdego żądania bazy danych na początku i zwalnianie go na końcu.Rozwiązanie jest całkowicie bezproblemowe, jednak można go używać tylko w systemach o małym obciążeniu.

2

można obsługiwać rozpoczęcie i zakończenie transakcji do wywołania DB Proszę zaznaczyć to

How to prevent EntityFramework deadlock when concurrently running these two statements

nadzieję, że ta pomoc

+0

Tak, ale mogę, ale głównym powodem, dla którego przeniosłem tę opcję do półautomatycznego przepływu, nie chcę ręcznie za każdym razem otwórz i zamknij transakcję. – AgentFire

+0

Interesujące pytanie, chciałbym zobaczyć dobrą odpowiedź na to dzięki dostarczonym technologiom, z których korzystasz. –

+1

Uwielbiam myśleć o tym problemie. Dostałem coś takiego i spędziłem kilka dni, aby to rozwiązać. Problem polega na tym, że potrzebujemy jednostki pracy dla tej sprawy, ale w EF mamy już to w DataContext, więc musimy wdrożyć DataContext z implementacją interfejsu IDisposable. Następnie po opakowaniu w zakres kontekstu, jak przy użyciu słowa kluczowego. i możemy zwolnić połączenie, które jest z nim powiązane po wywołaniu zakończonym. – thangchung

Powiązane problemy