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
Gestione degli stili CSS con le regole @layer
Miglioramenti agli screen reader e al contrasto in Angular
Utilizzare l'espressione if inline in una pipeline di Azure DevOps
Filtering sulle colonne in una QuickGrid di Blazor
Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
Utilizzare il trigger SQL con le Azure Function
Usare le navigation property in QuickGrid di Blazor
Eseguire script pre e post esecuzione di un workflow di GitHub
Modificare i metadati nell'head dell'HTML di una Blazor Web App
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Creazione di plugin per Tailwind CSS: espandere le funzionalità del framework dinamicamente
Creare un webhook in Azure DevOps