Gestione di transazioni in Object Services (Entity Framework)
Object Services supporta l'inserimento automatico delle transazioni. Questo significa che le attività eseguite in un contesto dell'oggetto, ad esempio l'esecuzione di query e il salvataggio delle modifiche ai dati nell'origine dati, possono essere isolate nell'origine dati eseguendo l'operazione in una transazione System.Transactions. Le transazioni sono utilizzate con Object Services per eseguire le operazioni seguenti:
Eseguire più operazioni nell'origine dati che devono essere estremamente coerenti, ad esempio query che dipendono dal corretto completamento delle modifiche dell'oggetto.
Coordinare le modifiche nel contesto dell'oggetto con le altre operazioni distribuite, ad esempio l'invio di un messaggio di posta elettronica di notifica o la scrittura in una coda di messaggi.
Le transazioni che richiedono l'inserimento di gestori di risorse aggiuntivi vengono chiamate transazioni distribuite. Le transazioni distribuite utilizzano uno strumento DTC (Distributed Transaction Coordinator) per gestire le risorse necessarie per completare la transazione. La promozione di una transazione a uno strumento DTC può essere un processo relativamente costoso da stabilire e completare. Alcuni gestori di risorse, come SQL Server 2005, supportano il protocollo delle transazioni PSPE (Promotable Single Phase Enlistment). Questo consente a un gestore di risorse di ospitare una transazione di cui è successivamente possibile eseguire l'escalation in modo che venga gestita da DTC (Distributed Transaction Coordinator), se necessario.
Per ulteriori informazioni, vedere Elaborazione delle transazioni in MSDN Library.
Le considerazioni seguenti riguardano l'utilizzo delle transazioni con Object Services:
Vengono sottoposte a transazione solo le operazioni eseguite nell'origine dati. Le modifiche apportate agli oggetti nel contesto dell'oggetto non vengono sottoposte a transazione. Le modifiche agli oggetti nel contesto sono visibili all'esterno dell'ambito della transazione.
Quando si chiama SaveChanges, se è presente una transazione corrente, questa viene utilizzata da Object Services per le operazioni nell'origine dati. In caso contrario, viene creata una nuova transazione per l'operazione. È possibile definire le transazioni utilizzando EntityTransaction, Transaction o TransactionScope.
Nota Per l'inserimento in una transazione esistente, la connessione potrebbe venire chiusa e riaperta da Object Services.
Quando tramite Object Services viene creata una nuova transazione per un'operazione SaveChanges, le modifiche agli oggetti nel contesto dell'oggetto non vengono accettate fino a quando la transazione non viene completata. In questo modo, viene garantita la coerenza dello stato del contesto dell'oggetto e dell'origine dati.
Quando si intende ritentare le operazioni in una transazione, è necessario verificare che lo stato degli oggetti nel contesto non venga reimpostato prima del completamento della transazione. A tale scopo, è necessario chiamare SaveChanges con un valore false per il parametro acceptChangesDuringSave, quindi chiamare AcceptAllChanges solo dopo il corretto completamento delle operazioni nella transazione. Per ulteriori informazioni, vedere Procedura: gestire le transazioni di Object Services (Entity Framework).
Durante l'esecuzione di un nuovo tentativo con le transazioni coordinate, è possibile chiamare SaveChanges una seconda volta senza prima chiamare AcceptAllChanges. In questo caso, verrà eseguito da Object Services un tentativo di riapplicare le stesse modifiche all'origine dati.
Vedere anche
Concetti
Provider EntityClient per Entity Framework
Gestione di connessioni in Object Services (Entity Framework)