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