2016-07-19 11 views
1

So verstehe ich, dass Sie Transaktionen erstellt automatisch von WCF mithilfe von Attributen zu den Operationen wie diese haben können:Sollte eine Transaktion auf WCF-Serviceebene oder auf Datenbankzugriffsebene sein?

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] 

Und auf der Schnittstelle wie folgt aus:

[TransactionFlow(TransactionFlowOption.Mandatory)] 

Ich weiß auch, dass eine Transaktion kann mit ADO.Net beim Lesen von der Datenbank erstellt werden, so ist meine Frage, welche ist die beste Option? Auf WCF-Ebene oder Datenbankebene? Oder hängt es vom konkreten Szenario ab?

+0

hängt es von dem spezifischen Szenario ab - jawohl es tut. Abhängig davon, was Sie mit der Transaktion gaurentee versuchen, wenn es nur Datenintegrität ist, dann ist ADO.net genug. –

Antwort

1

Die ADO.NET-Transaktion (local) ist direkt an die Datenbankverbindung gebunden (SqlConnection), was bedeutet, dass Sie die Verbindung weiterreichen müssen und keine Datenbankübergreifende Arbeit möglich ist. Dies ist Ihre schnellste Option.

Der WCF-Weg würde Ihnen ermöglichen, Ambient-Transaktionen zu haben. Zusammen mit den Attributen, die Sie notiert haben, benötigen Sie auch eine TransactionScope. Ein Vorteil von TransactionScope ist, dass es nicht nur an Datenbanken gebunden ist. Jeder transaktionsbewusste Anbieter kann es verwenden. Darüber hinaus kann es eine Transaktion behandeln, die mehrere Verbindungen umfasst. MSDTC kommt ins Spiel, wenn Sie mit mehreren Datenquellen arbeiten müssen. MSDTC implementiert ein zweiphasiges Festschreibungsprotokoll. Eine verteilte Transaktion ist langsamer als eine lokale Transaktion.

Also die Antwort ist - es kommt wirklich auf Ihre Anforderungen. Wenn Sie jedoch nur mit CRUD-Operationen in einer einzelnen Datenbank arbeiten, sind ADO.NET-Transaktionen ausreichend.