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
Le novità di .NET 7 e C# 11
Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
Cache policy su route groups di Minimal API in ASP.NET Core 7
Effettuare il download di un file via FTP con la libreria FluentFTP di .NET
Creare un router per Single Page Application con l'evento navigate
Collegare servizi a Azure Container App con i service connector
Utilizzare le Cache API di JavaScript per salvare elementi nella cache del browser
Utilizzare il tag HTML template
Usare Azure Application Gateway come reverse proxy per ASP.NET Core
Utilizzo di Map e Object in Javascript
Autenticazione basata su certificati con ASP.NET Core
Ottimizzare il codice JavaScript utilizzando WeakMap e WeakSet
I più letti di oggi
- devConf 2022 - Online
- .NET Conference Italia 2022 - Milano e Online
- .NET Conference Italia 2021 - Online
- Novità di ASP.NET Core 1.1
- L'object model di Microsoft SharePoint - Seconda parte
- Visual Studio 2019 Live - Milano
- Visual Studio 2010 per l'architetto
- Visual Studio 2017 e il supporto a Docker per ASP.NET Core
- Anteprima di ASP.NET Core 3
- Orchard CMS: dove cresce ASP.NET MVC - Prima parte