Ho letto un documento dal gruppo di pratiche Microsoft & (Data Access for Highly-Scalable Solutions: Using SQL, NoSQL, and Polyglot Persistence).L'utilizzo di TransactionScope nelle query Entity Framework è una buona idea?
Nel capitolo 3, nella sezione "Retrieving Data from the SQL Server Database", gli autori discutono sull'utilizzo di Entity Framework per caricare entità da un database. Ecco un po 'del loro codice di esempio:
using (var context = new PersonContext())
{
Person person = null;
using (var transactionScope = this.GetTransactionScope())
{
person = context.Persons
.Include(p => p.Addresses)
.Include(p => p.CreditCards)
.Include(p => p.EmailAddresses)
.Include(p => p.Password)
.SingleOrDefault(p => p.BusinessEntityId == personId);
transactionScope.Complete();
}
// etc...
}
Nota l'uso di un ambito della transazione personalizzato tramite il metodo GetTransactionScope
, implementato nella loro classe contesto di base in questo modo:
public abstract class BaseRepository
{
private static TransactionOptions transactionOptions = new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadCommitted
};
protected virtual TransactionScope GetTransactionScope()
{
return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
}
}
Working with Transactions (EF6 Onwards) su MSDN afferma:
In tutte le versioni di Entity Framework, ogni volta che si esegue SaveChanges() per inserire, aggiornare o eliminare sul database, il framework eseguirà il wrapping di tale operazione in una transazione [... ] il livello di isolamento della transazione è qualsiasi livello di isolamento che il provider di database considera la sua impostazione predefinita. Per impostazione predefinita, ad esempio, su SQL Server questo è READ COMMITTED. Entity Framework non esegue il wrapping delle query in una transazione. Questa funzionalità predefinita è adatta per molti utenti
L'enfasi è mia.
La mia domanda: è l'uso di un TransactionScope come mostrato sopra eccessivo, in particolare per i dati di legge, quando si utilizza Entity Framework?
(mi sono reso conto dopo la pubblicazione che la risposta a questa domanda potrebbe essere un po 'opinione basata, dispiace.)
Con questo 'isolationLevel', questo codice è eccessivo se la transazione contiene solo operazioni di lettura. Ma se 'isolationLevel' è' ReadUncommited', questo codice ti consentirà di leggere la riga sporca (non ancora impegnata). –
Si dovrebbe evitare l'ambito della transazione se non ha uno scopo aziendale. questo per evitare deadlock e problemi di prestazioni. – MichaelD