Condividi tramite


Concorrenza ottimistica: Introduzione

LINQ to SQL supporta il controllo della concorrenza ottimistica. La tabella seguente descrive i termini che si applicano alla concorrenza ottimistica nella documentazione di LINQ to SQL:

Termini Descrizione
Concorrenza Situazione in cui due o più utenti contemporaneamente tentano di aggiornare la stessa riga del database.
Conflitto di concorrenza La situazione in cui due o più utenti contemporaneamente tentano 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 della concorrenza ottimistica La tecnica che esamina prima di tutto se altre transazioni hanno modificato valori in una riga prima di consentire l'invio delle modifiche.

Contrasto con il controllo di concorrenza pessimistico, che blocca il record per evitare conflitti di concorrenza.

Il controllo ottimistico è così definito perché considera improbabile che una transazione interferisca con un'altra.
risoluzione dei conflitti Processo di aggiornamento di un elemento in conflitto eseguendo di nuovo una query sul database e quindi riconciliando le differenze.

Quando un oggetto viene aggiornato, lo strumento di rilevamento modifiche LINQ to SQL contiene i dati seguenti:

- Valori originariamente tratti dal database e usati per il controllo dell'aggiornamento.
: i nuovi valori del database della query successiva.

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

Qualsiasi conflitto tra membri individuati da LINQ to SQL viene aggiunto a un elenco di conflitti.

Nel modello a oggetti 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 del client.

La risoluzione di questo conflitto include l'identificazione dei membri dell'oggetto in conflitto e la decisione su cosa fare.

Annotazioni

Solo i membri mappati come Always o WhenChanged partecipano a controlli di concorrenza ottimistica. Non viene eseguito alcun controllo per i membri contrassegnati.Never Per altre informazioni, vedere UpdateCheck.

Esempio

Nello scenario seguente, ad esempio, User1 inizia a preparare un aggiornamento eseguendo una query sul database per una riga. User1 riceve una riga con valori di Alfreds, Maria e Sales.

User1 vuole modificare il valore della colonna Manager in Alfred e il valore della colonna Department in Marketing. Prima che User1 possa inviare tali modifiche, User2 ha inviato modifiche al database. Ora il valore della colonna Assistente è stato modificato in Mary e il valore della colonna Dipartimento in Servizio.

Quando User1 tenta ora di inviare modifiche, l'invio ha esito negativo e viene generata un'eccezione ChangeConflictException . Questo risultato si verifica perché i valori del database per la colonna Assistente e la colonna Reparto non sono quelli previsti. I membri che rappresentano le colonne Assistant e Department sono in conflitto. La tabella seguente riepiloga la situazione.

stato Direttore Assistente Dipartimento
Stato originale Alfreds Maria Vendite
Utente1 Alfred Commercializzazione
Utente2 Maria Servizio

È possibile risolvere conflitti come questo in modi diversi. Per altre informazioni, vedere Procedura: Gestire i conflitti di modifica.

Elenco di controllo per il rilevamento e la risoluzione dei conflitti

È possibile rilevare e risolvere i conflitti a qualsiasi livello di dettaglio. A un estremo, è possibile risolvere tutti i conflitti in uno dei tre modi (vedere RefreshMode) senza considerazioni aggiuntive. All'altro estremo, è possibile designare un'azione specifica per ogni tipo di conflitto in ogni membro in conflitto.

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

Le classi e le funzionalità per supportare la risoluzione dei conflitti nella concorrenza ottimistica in LINQ to SQL includono quanto segue:

Vedere anche