C # - Verwendung von Transaktionen in der Business-Schicht (SQL Server 2005+, Oracle) - gute Beispiele

7

Ich werde einen Service mit einer 3-Tier-Architektur aufbauen und bin wirklich besorgt darüber, wie Transaktionen in einer abgewickelten Weise gehandhabt werden.

Ich weiß, dass ich 2 Optionen habe: IDbTransaction und TransactionScope ... aber ich bin nicht wirklich entschieden, für welche ich gehen soll, obwohl ich viel recherchiert habe.

Ich würde für TransactionScope gehen, aber ich möchte DTC nicht miteinbeziehen ... plus ich brauche Unterstützung für SQLServer2005 und Oracle. (Ich bin mir bewusst, dass ich immer nur eine Verbindung geöffnet haben muss)

Ich würde gerne sehen, gute Beispiele / Muster ihrer Verwendung für beide Fälle ... Gute Links würden gut tun.

So wie eine BL-Klasse und DAL-Klasse aussehen würde ... aber auch wie Transaktionen / Verbindungen zwischen ihnen erstellt und transportiert werden.

Bearbeiten1: Ich suche nach einer Art der Umsetzung dieses (aber für beide Optionen):

%Vor%

Bearbeiten2: Da Denis mir eine sehr gute Alternative angeboten hat ... warte ich immer noch darauf, dass jemand mir ein gutes Beispiel eines Modells mit der Interaktion zwischen Business-Schicht und Datenschicht zeigt, indem ich ' TransactionScope ' benutze

Danke.

    
Learner 10.06.2011, 15:56
quelle

4 Antworten

11

In diesem Fall verwende ich derzeit mehrere Repositories und mehrere UnitOfWork-Ansätze. Nehmen wir an, Sie haben CustomerRepository und InvoiceRepository. Wenn Sie dies tun müssen:

%Vor%

und habe diese beiden als eine Transaktion, dann was ich mache ist auf Repository-Erstellung Ich gebe ihnen die gleiche UnitOfWork, wie:

%Vor%

so dass Aussagen oben sind jetzt:

%Vor%

Die gesamte Magie ist darunter, abhängig davon, was Sie als Datentechnologie verwenden (entweder ORM wie NHibernate oder vielleicht RAW ADO.NET - und das wird in den meisten Fällen nicht empfohlen).

Ein gutes Beispiel für Repository-Muster und UnitOfWorks finden Sie unter Tutorial , aber beachten Sie, dass darin nicht mehrere UnitOfWorks aktiv sein können (und einige Anwendungen brauchen das eigentlich, also kein echtes Problem). Außerdem verwendet das Tutorial NHibernate. Wenn Sie also mit dem ORM-Konzept nicht vertraut sind, schlage ich vor, dass Sie sich darauf einlassen (sofern Ihr Zeitplan dies zulässt).

noch eine Sache: Sie haben auch mehr fortgeschrittene Muster hier, wie Sitzung pro Konversation und so, aber das ist fortgeschrittenes Zeug, in dem ich gerade meinen Kopf eingewickelt habe, wenn Sie einen Blick auf uHaddIns-Projekte werfen wollen ( für NHibernate auch)

    
Denis Biondic 13.06.2011, 12:27
quelle
4

Ich würde für TransactionScope gehen, weil es viel einfacher zu verwenden ist, da Sie kein Transaktionsobjekt übertragen müssen oder es nicht an jede Methode übergeben müssen. Es ist ambient . Das bedeutet, dass Entwickler die meiste Zeit Transaktionen vergessen, coole geschäftsorientierte Methoden schreiben und später Transaktions-Wrapper (mit 'using') hinzufügen können, wo sie später wirklich benötigt werden. (klingt idyllisch ich weiß, aber es ist fast das).

Entgegen der landläufigen Meinung bedeutet die Verwendung eines TransactionScopes nicht, dass MSDTC involviert ist, siehe hier für eine Zusammenfassung:

Vermeiden Sie unerwünschte Eskalation zu verteilten Transaktionen

Und wenn Sie wirklich eine verteilte Transaktion benötigen, wie wollen Sie dies auch ohne MSDTC machen? Was bei TransactionScope wieder interessant ist, ist, dass es bei Bedarf zu MSDTC eskaliert, ohne dass etwas in Ihrem Code geändert wird.

    
Simon Mourier 13.06.2011 09:39
quelle
3

Sie können diese beiden Technologien abstrahieren, indem Sie einen dünnen Wrapper implementieren, den Sie in Ihrer Business-Schicht verwenden. Sagen wir etwas wie:

%Vor%

Sie können dann eine Implementierung verwenden, die nur eine Datenbanktransaktion öffnet. Wenn Sie ein anderes Transaktionssystem einbeziehen müssen, wechseln Sie einfach die Arbeitseinheitseinheit in eine Einheit, die ein TransactionScope anstelle der einfachen Datenbanktransaktion öffnet.

    
Oliver Hanappi 11.06.2011 10:50
quelle
2

Das UnitOfWork-Muster eignet sich perfekt für eine klare Transaktionsverarbeitung (unter anderem). Hier ist eine gute Implementierung des Musters, das in einigen Heavy-Duty-Anwendungen verwendet wird:

Ссылка

Obwohl Sie DataProvider für ORM Ihrer Wahl implementieren müssen (NH, EF, ...), aber es ist ziemlich trivial.

    
Kostassoid 15.06.2011 11:45
quelle