Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.
Specificare o rivedere UpdateCheck le opzioni nel modello a oggetti.
Per altre informazioni, vedere Procedura: Specificare i membri testati per i conflitti di concorrenza.
Nel blocco try/catch della chiamata a SubmitChanges, specificare a quale punto si desidera generare eccezioni.
Per altre informazioni, vedere Procedura: Specificare quando vengono generate eccezioni di concorrenza.
Determinare il livello di dettaglio del conflitto da recuperare e includere il codice nel blocco try/catch di conseguenza.
Per altre informazioni, vedere Procedura: Recuperare informazioni sui conflitti di entità e Procedura: Recuperare informazioni sui conflitti dei membri.
Includere nel
try/catchcodice come risolvere i vari conflitti individuati.Per altre informazioni, vedere Procedura: Risolvere i conflitti mantenendo i valori del database, Procedura: Risolvere i conflitti sovrascrivendo i valori del database e Procedura: Risolvere i conflitti unendo i valori del database.
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: