Bei welcher Zeile im folgenden Code sollte ich meine Arbeitseinheit festlegen?

9

Ich habe den folgenden Code, der in einer Transaktion ist. Ich bin mir nicht sicher, wo / wann ich meine Arbeitseinheit beauftragen sollte.

Ich habe absichtlich nicht erwähnt, welche Art von Respoistory ich verwende - z. Linq-To-SQL, Entity Framework 4, NHibernate, etc.

Wenn jemand weiß, wo, können sie bitte erklären, warum sie gesagt haben, wo? (Ich versuche, das Muster anhand von Beispielen zu verstehen, anstatt meinen Code zum Funktionieren zu bringen).

Folgendes habe ich: -

%Vor%     
Pure.Krome 23.03.2010, 13:39
quelle

3 Antworten

0

Commit auf # 4, nachdem alle Operationen für alle Repositories durchgeführt wurden. Wenn Sie sich vorher verpflichten, werden die nach diesem Aufruf vorgenommenen Änderungen nicht übernommen.

    
Even Mien 23.03.2010, 14:00
quelle
3

Ein guter Ausgangspunkt für die Beantwortung dieser Frage ist die Definition der Arbeitseinheit aus Mustern der Unternehmensarchitektur ( Ссылка ). :

  

Behält eine Liste von Objekten bei, die von einer Geschäftstransaktion betroffen sind, und koordiniert das Schreiben von Änderungen und die Lösung von Nebenläufigkeitsproblemen.

Die Grenzen Ihrer Arbeitseinheit sind durch die Grenzen Ihrer Geschäftstransaktion definiert - in diesem Fall ist dies gleichbedeutend mit den Grenzen der Datenbanktransaktion (aber im Fall einer lang andauernden Geschäftstransaktion, die mehrere Anforderungen umfasst, die möglicherweise nicht der Fall sein).

Ausgehend von der obigen Definition und basierend auf meinem Verständnis des gezeigten Codeabschnitts sollten Sie die Arbeitseinheit am Ende des Geschäftsvorgangs (# 4) festlegen.

Nebenbei sollten Ihre Datenbanktransaktionsbereiche immer kleiner sein als der Bereich Ihrer UoW ​​(d. h. der tx-Bereich liegt zwischen dem Aufruf von UoW.Begin () und UoW.Commit ()). Wenn Ihre UOW mehrere Datenbanktransaktionen umfasst, würden Sie eine kompensierende Transaktion verwenden, um die UOW neu zu verteilen, wenn eine der inneren Transaktionen fehlgeschlagen ist. In diesem Fall, und insbesondere, wenn Ihr UOW seine eigenen Datenbanktransaktionsgrenzen bei UoW.Begin () und UoW.Commit () erstellt, würde ich den Transaktionsbereich entfernen, da dies einfach unnötigen Rauschen zum Code hinzufügt.

    
Neal 30.03.2010 00:07
quelle
0

Unter der Annahme, dass Ihr Datenspeicher IDs zuweist, müssen Sie # 1 (mit NHibernate sollten Sie sogar spülen), dann am Ende # 4 committen.

    
Janusz Skonieczny 29.03.2010 23:18
quelle

Tags und Links