Quando utilizziamo il metodo SaveChanges o la sua controparte asincrona, EF genera automaticamente una transazione ed esegue i comandi all'interno di essa. Prendiamo come esempio il seguente codice.
using var ctx = new MyContext(); ctx.Customers.Add(customer); ctx.Orders.Add(order); ctx.Logs.Add(log); ctx.SaveChanges();
Se osserviamo la lista di comandi inviati al database notiamo che il primo comando è "Begin Transaction", seguito dai comandi per inserire i tre record seguiti a loro volta dal comando "Commit Transaction" o "Rollback Transaction" rispettivamente se i comandi precedenti sono stati eseguiti correttamente o meno.
Quando dobbiamo eseguire comandi multipli (ad esempio aggiornare più tabelle o inserire più record), l'utilizzo di una transazione è necessario, ma quando dobbiamo eseguire un solo comando, la situazione cambia. Quando dobbiamo persistere un solo oggetto e quindi generare un solo comando, il database gestisce autonomamente la transazione e EF può quindi evitare di crearne una esplicitamente risparmiando ben due round-trip con il database (uno per iniziare la transazione e uno per completarla).
Per questo motivo, a partire da EF 7, quando si deve persistere un solo oggetto, i comandi per gestire la transazione non vengono più generati ottimizzando le performance.
using var ctx = new MyContext(); ctx.Customers.Add(customer); ctx.SaveChanges(); //non esegue i comandi per la transazione
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire query verso tipi non mappati in Entity Framework Core
Gestire liste di tipi semplici con Entity Framework Core
Eseguire le GitHub Actions offline
Garantire la provenienza e l'integrità degli artefatti prodotti su GitHub
Referenziare un @layer più alto in CSS
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Usare le navigation property in QuickGrid di Blazor
Generare token per autenicarsi sulle API di GitHub
Utilizzare gRPC su App Service di Azure
Supportare lo HierarchyID di Sql Server in Entity Framework 8
Usare le collection expression per inizializzare una lista di oggetti in C#
Generare un hash con SHA-3 in .NET