Condividi tramite


Cenni preliminari sulla concorrenza ottimistica (LINQ to SQL)

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

Termini

Descrizione

concorrenza

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 di concorrenza

Tecnica utilizzata per risolvere i conflitti di concorrenza.

controllo della 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 concorrenzache 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 utilizzati 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, in LINQ to SQL vengono determinati 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.

NotaNota

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:

 

Manager

Assistant

Department

Stato originale

Alfreds

Maria

Sales

User1

Alfred

 

Marketing

User2

 

Mary

Service

È possibile risolvere questo tipo di conflitti in diversi modi. Per ulteriori informazioni, vedere Procedura: gestire i conflitti di modifiche (LINQ to SQL).

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 utilizzando 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:

Vedere anche

Altre risorse

Procedura: gestire i conflitti di modifiche (LINQ to SQL)