Θέλουμε διαφορετικά βήματα πρόσβασης στη βάση να συμμετέχουν στην ίδια συναλλαγή.
Το TransactionScope ορίζει ένα κοινό περιβάλλον συναλλαγής γύρω από τον κώδικα. Συμβατές βιβλιοθήκες πρόσβασης στη βάση μπορούν να συμμετέχουν σε αυτό.
Παράδειγμα
Στον κώδικα:
-
optionsείναι οι ρυθμίσεις τουShopDbContext. -
Requiredχρησιμοποιεί υπάρχουσα κοινή συναλλαγή ή δημιουργεί μία. -
ReadCommittedεπιτρέπει ανάγνωση οριστικοποιημένων αλλαγών άλλων συναλλαγών. -
Enabledεπιτρέπει στην κοινή συναλλαγή να ακολουθεί την εκτέλεση μετά απόawait.
using System.Transactions; using (var scope = new TransactionScope( TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted }, TransactionScopeAsyncFlowOption.Enabled)) { await using var db = new ShopDbContext(options); db.Orders.Add(order); await db.SaveChangesAsync(); db.AuditEntries.Add(new AuditEntry { Message = "Δημιουργήθηκε παραγγελία" }); await db.SaveChangesAsync(); scope.Complete(); } Αν αποτύχει η δεύτερη αποθήκευση, δεν φτάνουμε στο Complete() και η κοινή συναλλαγή ακυρώνεται.
Τι κάνει το Complete
Δηλώνει ότι το συγκεκριμένο τμήμα εργασίας ολοκληρώθηκε επιτυχώς.
Δεν σημαίνει ότι έγινε ήδη το τελικό commit.
Αν το scope δημιούργησε τη συναλλαγή, η διαδικασία οριστικοποίησης γίνεται στην έξοδο από το using. Αν συμμετέχει σε εξωτερική συναλλαγή, το τελικό commit εξαρτάται από εκείνον που την ελέγχει.
Το Complete() μπαίνει τελευταίο. Τεκμηρίωση Microsoft
Πότε το επιλέγουμε
Είναι χρήσιμο όταν διαφορετικά συμβατά τμήματα πρόσβασης σε δεδομένα χρειάζονται κοινή συναλλαγή.
Για μια απλή ροή με ένα DbContext, η BeginTransactionAsync() συνήθως κάνει τον έλεγχο πιο εμφανή.
Χρειάζεται επίσης προσοχή:
- Χωρίς ρητή επιλογή απομόνωσης, μια νέα συναλλαγή του scope χρησιμοποιεί
Serializable. - Η υποστήριξη εξαρτάται από τη βιβλιοθήκη σύνδεσης με τη βάση.
- Πολλές συνδέσεις ή βάσεις μπορεί να απαιτήσουν πρόσθετο συντονισμό.
- Η ολοκλήρωση του scope δεν παρέχει ασύγχρονο commit/rollback.
