7 Stimmen

Strategien zur Vermeidung der Transaktionseskalation in System.Transactions

Ausgehend von der Antwort auf meine vorherige Frage Transaktionen tun vom LTM zum DTC erhöht werden, wenn während einer Transaktion mehrere Verbindungen geöffnet werden, auch wenn die Verbindungen alle denselben Verbindungsstring haben.

Meine nächste Frage ist also, welche Strategien man anwenden könnte, um dieses "Merkmal" zu vermeiden. Mir scheint, dass ich aufgrund der Ressourcennutzung sicherstellen möchte, dass das LTM so oft wie möglich verwendet wird. Die einzige Möglichkeit, die ich mir in einer objektorientierten Geschäftslogikschicht vorstellen kann, ist die Erstellung eines statischen Verbindungsobjekts auf Anforderungsebene in der Datenzugriffsschicht und die gemeinsame Nutzung dieses Objekts bei Aufrufen, bis die Anforderung abgeschlossen ist (das implizite Wissen hier ist, dass die Geschäftsobjektentitäten diskret sind und nicht wissen, in welcher Reihenfolge sie aufgerufen werden, und zusätzlich die Tatsache, dass man ein Verbindungsobjekt nicht bis zur Geschäftsobjektschicht aufblasen möchte, da dies Details der Datenspeicherimplementierung in eine andere Schicht einfließen lassen würde).

Hat sonst noch jemand eine Idee, die die Schichtkapselung eines n-Tier-Systems nicht völlig ruiniert?

2voto

tvanfosson Punkte 506878

Was ich verwendet habe, ist eine TransactionHelper-Klasse, die alle Befehle in einem TableAdapter aktualisiert, um die Verbindung und die Transaktion durch die des TableAdapters zu ersetzen, der die Transaktion initiiert. Sie können finden ein Code, der dies tut die Sie nach Bedarf anpassen können, in Scott Lanfords Blog, CodeExperiment . Ryan Whitaker hat eine ähnlicher Ansatz .

Beachten Sie, dass seit ich LINQToSQL verwendet habe, ich dieses Problem nicht mehr habe. Vielleicht möchten Sie die Verwendung von LINQToSQL oder nHibernate als alternative Lösung in Betracht ziehen. Beide bieten eine gute Unterstützung für lokale Transaktionen.

0voto

MicSim Punkte 25646

Ich würde empfehlen, eine Wrapper-Klasse für die Verwaltung von Verbindungen, Transaktionen und Befehlsobjekten zu schreiben, also die ganze DB-Sache. Es ist eine Art sehr leichtgewichtiges nHibernate. Diese Klasse würde Methoden für executeStatement(...), executeQuery(...), addParameter(...), startTransaction(...) und so weiter anbieten.

Beim Starten einer Transaktion könnte man eine (ggf. eindeutige) Kennung angeben, an die man alle folgenden Anfragen bezüglich derselben Transaktion binden könnte. Diese Wrapper-Klasse würde dann eine statische Zuordnung dazu enthalten, welche Transaktion mit welcher Verbindung läuft und würde automatisch die richtige verwenden oder bei Bedarf eine neue erstellen.

Sie erhalten einige zusätzliche Funktionen aus diesem Ansatz, da Sie alle Ihre Persistenz Sachen zentralisiert haben wird:

  • einfache Protokollierung aller Anweisungen für Debugging und Leistungstests
  • automatische Wiederholungslogik bei Sperr-/Netzproblemen
  • Einfacher Wechsel des DB-Anbieters
  • grundsätzlich einige der Möglichkeiten, die man mit Persistenz-Frameworks wie nHibernate hat, aber leichter und nicht so ausgefeilt

0voto

casperOne Punkte 72238

Ich muss fragen, was der Grund dafür ist, dass Sie so sehr versuchen, den DTC zu vermeiden? Weder in dieser noch in der vorherigen Antwort wird erwähnt, warum, und es scheint, als ob Sie unter dem Syndrom der vorzeitigen Optimierung leiden.

0voto

JoshBerke Punkte 64214

Wie Casper bereits sagte, könnte es verfrüht sein, den DTC zu vermeiden, obwohl er ein erhebliches Gewicht hat. Sie könnten Ihre Verbindungen mit statischen Fabriken implementieren, so dass einfach neue Objekte zurückgegeben werden. Wenn Sie dann feststellen, dass Sie ein Problem haben, könnten Sie einen Mechanismus implementieren, der die Transaktionen in einem TLS (oder httpcontext, wenn Sie in ASP) speichern kann. Und Sie müssen keinen Code ändern.

Diese Frage wurde bereits gestellt und beantwortet, aber ich kann sie nicht finden, und wenn ich sie finde, werde ich dies aktualisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X