Μια αγορά χρειάζεται δύο αλλαγές:

  1. Να δημιουργηθεί η παραγγελία.
  2. Να μειωθεί το απόθεμα.

Αν αποθηκευτεί μόνο η παραγγελία, η αγορά έχει μείνει μισή.

Ένα transaction, δηλαδή μια συναλλαγή, ομαδοποιεί αλλαγές ώστε να ολοκληρωθούν όλες μαζί ή να ακυρωθούν όλες μαζί.

Ένα απλό παράδειγμα

Θέλουμε να αποθηκεύσουμε μια παραγγελία και μια καταγραφή ιστορικού.

Το db είναι ένα ήδη ρυθμισμένο DbContext: το αντικείμενο μέσω του οποίου διαβάζουμε και γράφουμε δεδομένα με το EF Core.

db.Orders.Add(new Order { ProductId = 7, Quantity = 2 }); db.AuditEntries.Add(new AuditEntry { Message = "Δημιουργήθηκε παραγγελία" }); await db.SaveChangesAsync(); 

Το Add() καταγράφει στη μνήμη τι θέλουμε να προσθέσουμε.

Το SaveChangesAsync() στέλνει τις αλλαγές στη βάση.

Με τις προεπιλεγμένες ρυθμίσεις και υποστήριξη συναλλαγών, το EF αποθηκεύει τις αλλαγές αυτής της κλήσης ατομικά: όλες μαζί ή καμία. Τεκμηρίωση Microsoft

Πότε χρειάζεται προσοχή

Δύο ξεχωριστές αποθηκεύσεις δεν αποτελούν αυτόματα μία κοινή συναλλαγή:

db.Orders.Add(order); await db.SaveChangesAsync(); db.Invoices.Add(invoice); await db.SaveChangesAsync(); 

Αν αποτύχει η δεύτερη κλήση, η παραγγελία μπορεί να έχει ήδη αποθηκευτεί.

Το ίδιο DbContext δεν σημαίνει ότι υπάρχει συνεχώς ανοιχτό transaction.

Όταν πολλά βήματα πρέπει να ολοκληρωθούν μαζί, μπορούμε να ανοίξουμε δική μας συναλλαγή. Αυτό καλύπτει το επόμενο άρθρο.

BeginTransactionAsync CommitAsync και RollbackAsync με απλό παράδειγμα

nikosstit@gmail.com