Verschachteltes Transaktionsverhalten in EF6

8

Ich verwende derzeit TransactionScope, um Transaktionen in meiner Datenschicht zu verwalten, aber ich habe Probleme mit verschachtelten Transaktionen und Async festgestellt, wobei die Verbindung während der verschachtelten Transaktion zu schließen scheint oder die Transaktion zu MSDTC hochgestuft wird. Ich habe das genaue Problem nicht gefunden, aber nachdem ich es gelesen habe, sieht es so aus, als ob dieses Szenario nicht besonders gut unterstützt wird und ich es nicht unterstütze sollte stattdessen Database.BeginTransaction () verwenden.

Mein Problem ist, dass ich keine Informationen darüber finden kann, wie Database.BeginTransaction () mit verschachtelten Transaktionen arbeitet, insbesondere in meinem Szenario, in dem ich die Ambient-Transaktion verwenden möchte, anstatt eine neue zu erstellen. Mein Verdacht ist, dass es nicht so funktionieren soll und wenn ich verschachtelte Transaktionen verwalten möchte, sollte ich das Transaktionsmanagement abstrahieren, um mir mehr Kontrolle zu geben.

Ich wollte keine unnötigen Schichten von Abstraktionen hinzufügen. Ich wollte wissen, ob jemand Erfahrung in diesem Bereich hat und konnte das Verhalten von Database.BeginTransaction () bestätigen, wenn es in einer anderen Transaktion verschachtelt wurde.

Zusätzliche Informationen über meine DAL: Basierend auf dem CQS-Muster tendiere ich dazu, DB-bezogenen Code in Befehls- oder Abfrage-Handlern einzukapseln, so dass ein vereinfachtes / künstliches Beispiel dafür wäre, wie diese Verschachtelung aussehen würde:

%Vor%     
Joel Mitchell 08.12.2015, 15:29
quelle

1 Antwort

5

Es gibt keine verschachtelten Transaktionen in dem Sinne, dass der innere Code unabhängig voneinander committen oder rollback kann. Geschachtelte Transaktionen führen nur eine Ref-Zählung durch. Beim letzten Commit bekommen wir einen physischen Commit. Beim ersten Rollback erhalten wir einen physischen Rollback. Nur stellen Sie sicher, dass Sie sich dessen bewusst sind.

Es ist wichtig, MSDTC-Nutzung zu vermeiden. Dies ist sowohl mit TransactionScope als auch mit BeginTransaction möglich. Bei ersterem müssen Sie Open explizit die Verbindung innerhalb des Bereichs angeben, damit EF nicht ständig neue Verbindungen öffnet.

Wie Sie in der Ausgabe gelesen haben, ist dies ein Fehler in EF (den L2S nicht hatte). Bitte nehmen Sie sich die Zeit, das Problem zu kommentieren, um sicherzustellen, dass das Team weiß, dass die Kunden dieses Problem haben.

  

besonders in meinem Szenario, wo ich die Ambient-Transaktion verwenden möchte, anstatt eine neue zu erstellen.

Dies ist perfekt für TransactionScope . Ich denke, dein Wechsel zu BeginTransaction basiert auf einem Missverständnis. Vielleicht kannst du das in den Kommentaren klären.

  

bestätigt das Verhalten von Database.BeginTransaction (), wenn es in einer anderen Transaktion verschachtelt ist

Im ersten Absatz erklärt.

  

Zusätzliche Informationen über meine DAL: Basierend auf dem CQS-Muster tendiere ich dazu, DB-bezogenen Code in Befehls- oder Abfrage-Handlern einzukapseln, so dass ein vereinfachtes / künstliches Beispiel dafür wäre, wie diese Verschachtelung aussehen würde:

Der Code sieht gut aus, außer für den fehlenden db.Connection.Open() Aufruf (wie oben erklärt).

Dieses Muster unterstützt die Ausführung mehrerer Abfragen und Befehle in derselben Transaktion. Wickeln Sie einfach einen anderen Bereich darum herum. Stellen Sie sicher, dass Verbindungen nicht zweimal geöffnet werden, z. Überprüfen Sie conn.State , bevor Sie Maßnahmen ergreifen.

    
usr 08.12.2015, 15:37
quelle