Laden...

WCF WebService Transaction Rollback

Erstellt von ZeroQool vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.674 Views
Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 12 Jahren
WCF WebService Transaction Rollback

Hallo,

ich benötige einige Ansatzhilfen für folgende Problemstellung.

Ich habe einen WCF WebService mit mehreren Services und n-Methoden.

Datenbank: SQL Server 2008
zB. PersonService: CreatePerson, CreateBank, CreateContact usw.
CustomerService: CreateCustomer

Jede Methode erstellt eine ADO DB Connection und schließt sie am Ende wieder.

Jetzt habe ich als weitere Schicht einen Controller, der die WebServices aufruft und dort eine CreateCustomer Methode erstellt. Diese erstellt zuerst die Person, anschließend die Bankdaten und Kontaktdaten und am Ende den Customer. Funktioniert so alles wunderbar, bis auf die Tatsache, wenn zB bei CreateContact ein Fehler ausgelöst wird. Dann sind zB die Tabellen Person und Person.Banks bereits mit Daten gefüllt. Diese muss ich aber irgendwie wieder löschen (Rollback). Natürlich könnte ich mir von jedem erstellen Satz die Unique Id zurückgeben lassen die erstellt worden ist und manuell löschen, aber das erscheint mir ersten Moment etwas umständlich, da ich noch andere Methoden und Services habe wo das gleiche Schema ist.

Wie könnte ich das mit Transaction Rollback realisieren, da ich die Connection bei jeder Methode wieder schließen. Danke

16.842 Beiträge seit 2008
vor 12 Jahren

Hi,

nutze doch einen Repository Pattern zusammen mit einem IUnitOfWork-Container.
Wenn ein Fehler auftaucht, dann speicherst Du den DbContext nicht ab bzw. nimmst aktiv einen Rollback vor, sodass die Änderungen nicht in der DB übernommen werden.

Dazu gibts auch unzählige Beispiele via Google.

Gruß

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo ZeroQool,

schau dir in diesem Zusammenhang auch "Sessions" an. Mit denen kannst du das - unter Berücksichtigung von dem was Abt gesagt hat - leicht umsetzen.

Wenn du jedoch basicHttpBinding verwendet sind keine Sessions von Haus aus möglich und hier muss das Session-Verhalten selbst nachgebaut werden. Als Session-Id mit der dann die Aktionen ablaufen verwende eine Guid.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 12 Jahren

Hallo Abt,

dein Lösungsansatz hört sich sehr interessant an, deshalb habe ich einige Zeit darüber gegoogelt. Allerdings haben sich währenddessen noch einige Fragen ergeben, die du mir eventuell kurz beantworten könntest.

Zur Zeit arbeite ich nicht mit dem EF, deshalb müßte ich das ganze "umstellen", damit ich den DbContext nutzen kann oder?

Habe mir so einige Beispiele bzgl. Repository u UOW angeguckt. Allerdings war dort nie der Layer "WebService" dazwischen. Das Repository hat immer auf den DataLayer zugegriffen. In meinem Fall wäre es doch der WCF WebService?

Also wie ich das verstehe würde ich den Rollback im WCF Service machen oder? aber dann würde ich alles was im Controller ist in den Service auslagern müssen, sprich bei CreateCustomer (->createPerson -> createBank ->createContact usw.)

Danke