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.
Specificare o modificare le opzioni per UpdateCheck nel modello a oggetti.
Per altre informazioni, vedere Procedura: specificare per quali membri viene eseguito il test dei conflitti di concorrenza.
Nel blocco try/catch della chiamata a SubmitChanges specificare a che punto dovranno essere generate eccezioni.
Per altre informazioni, vedere Procedura: specificare quando vengono generate eccezioni di concorrenza.
Determinare la quantità di dettagli sul conflitto da recuperare, quindi includere nel blocco try/catch il codice necessario.
Per altre informazioni, vedere Procedura: recuperare informazioni sui conflitti di entità e Procedura: recuperare informazioni sui conflitti tra membri.
Includere nel codice
try
/catch
come si vogliono risolvere i diversi conflitti individuati.Per altre informazioni, vedere Procedura: risolvere i conflitti mantenendo valori di database, Procedura: risolvere i conflitti sovrascrivendo i valori di database e Procedura: risolvere i conflitti mediante l'unione con valori di database.
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: