DEV Community

nikosst
nikosst

Posted on Edited on

Τι είναι ένα transaction και τι κάνει ήδη το EF Core

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

  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();
Enter fullscreen mode Exit fullscreen mode

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

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

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

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

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

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

db.Invoices.Add(invoice);
await db.SaveChangesAsync();
Enter fullscreen mode Exit fullscreen mode

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

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

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

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


nikosstit@gmail.com

Top comments (0)