Um in Entity-Framework Transaktionen zu nutzen kann ein TransactionScope benutzt werden.
Wird ein DataContext innerhalb eines TransactionScope erzeugt, so nimmt diese automatisch an der Transaktion teil.
Werden Transaktionen ineinander verschachtelt oder beispielsweise FileIO benutzt wird, dass der Distributed Transaction Coordinator notwendig ist, da es unterschiedliche Klassen in .net gibt, die an einer Transaktion teilnehmen können. Dieser ist ein Service, das im Bedarfsfall gestartet werden muss (sofern es sich nicht vermeiden lässt).
Es gibt aber auch eine einfacher Version:
Eine Transaktion kann aber auch für einen DataContext erstellt werden. Dabei wird die Transaktion über DataContext.Database erstellt. Da die Transaktion dann nur für diese Datenbankverbindung existiert, ist die Verwendung des Distributed Transaction Coordinator daher nicht notwendig.
Bei Erstellung der Transaktion kann der Isolation-Level angegeben werden. Hier kann z. B. auch Read-Uncomitted gewählt werden, wodurch keine Locks in der Datenbank angelegt werden. Dies ist z. B. für reine Lesezugriffe (Suchen, Berichte) optimal.
Dazu ein Sourcebeispiel für Auswertungen:
using (var db = new Utils.DB.DBEntities()) using (var dbTans = db.Database.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted)) { ... }
ACHTUNG: Bei der Verwendung sperrender Transaktionen kann es zu Deadlocks kommen!
Ein Sourcebeispiel für Aktualisierungen:
using (var db = new Utils.DB.DBEntities()) using (var dbTans = db.Database.BeginTransaction()) { ... db.SaveChanges(); dbTans.Commit(); }
Ist doch cool, oder?
LG,
Georg.