Concorrenza ottimistica: panoramica

LINQ to SQL supporta il controllo della concorrenza ottimistica. Nella tabella seguente vengono descritti i termini applicabili alla concorrenza ottimistica nella documentazione di LINQ to SQL:

Terms Descrizione
concurrency Situazione in cui due o più utenti tentano contemporaneamente di aggiornare la stessa riga del database.
conflitto di concorrenza Situazione in cui due o più utenti tentano contemporaneamente di inviare valori in conflitto a una o più colonne di una riga.
controllo della concorrenza Tecnica usata per risolvere i conflitti di concorrenza.
controllo di concorrenza ottimistica Tecnica che consente di esaminare se i valori presenti in una riga in altre transazioni sono stati modificati prima di consentire l'invio di modifiche.

Si differenzia dal controllo pessimistico della concorrenza che blocca il record per evitare conflitti di concorrenza.

Il controllo ottimistico viene così definito perché considera improbabile la possibilità che una transazione interferisca con un'altra.
risoluzione dei conflitti Processo di aggiornamento di un elemento in conflitto mediante la riesecuzione di una query sul database e la risoluzione delle differenze.

Quando un oggetto viene aggiornato, la funzionalità di ricerca delle modifiche di LINQ to SQL conserva i dati seguenti:

- I valori rilevati in origine dal database e usati per il controllo degli aggiornamenti.
- I nuovi valori del database dalla query successiva.

LINQ to SQL determina quindi se l'oggetto è in conflitto, ovvero se uno o più valori del membro sono stati modificati. Se l'oggetto è in conflitto, LINQ to SQL determina quindi i membri in conflitto.

Qualsiasi conflitto fra membri individuato da LINQ to SQL viene aggiunto a un elenco di conflitti.

Nel modello a oggetti di LINQ to SQL si verifica un conflitto di concorrenza ottimistica quando entrambe le condizioni seguenti sono vere:

  • Il client tenta di inviare modifiche al database.

  • Uno o più valori di controllo degli aggiornamenti sono stati aggiornati nel database dall'ultima lettura effettuata dal client.

Per risolvere questo conflitto, è necessario individuare i membri dell'oggetto in conflitto, quindi decidere come procedere.

Nota

Solo i membri di cui è stato eseguito il mapping come Always o WhenChanged fanno parte dei controlli di concorrenza ottimistica. Per i membri contrassegnati come Never non viene eseguito alcun controllo. Per ulteriori informazioni, vedere UpdateCheck.

Esempio

Nel seguente scenario, ad esempio, User1 prepara un aggiornamento mediante l'esecuzione di una query su una riga del database. User1 riceve una riga con i valori Alfreds, Maria e Sales.

User1 desidera modificare il valore della colonna Manager in Alfred e il valore della colonna Department in Marketing. Prima che User1 possa inviare le modifiche, User2 ha già inviato le proprie modifiche al database. Ora il valore della colonna Assistant è stato modificato in Mary e il valore della colonna Department è cambiato in Service.

Quando User1 tenta di inviare le modifiche, l'invio non viene completato e viene generata un'eccezione ChangeConflictException. Questo risultato si verifica perché i valori del database per le colonna Assistant e Department non sono quelli previsti. I membri che rappresentano le colonne Assistant e Department sono in conflitto. Nella tabella seguente è riepilogata questa situazione:

Provincia Manager Assistente Department
Stato originale Alfreds Maria Vendite
User1 Alfred Marketing
User2 Mary Servizio

È possibile risolvere questo tipo di conflitti in diversi modi. Per altre informazioni, vedere Procedura: gestire i conflitti di modifiche.

Elenco di controllo per il rilevamento e la risoluzione dei conflitti

È possibile rilevare e risolvere i conflitti a qualsiasi livello di dettaglio. Da una parte è possibile risolvere tutti i conflitti usando una delle tre modalità disponibili (vedere RefreshMode) senza ulteriori considerazioni. Dall'altra è possibile definire un'azione specifica per ogni tipo di conflitto e per ogni membro in conflitto.

Tipi LINQ to SQL che supportano l'individuazione e la risoluzione dei conflitti

Di seguito sono elencate le classi e le funzionalità di LINQ to SQL che supportano la risoluzione di conflitti nella concorrenza ottimistica:

Vedi anche