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.
La concorrenza ottimistica deriva il nome dal presupposto ottimistico che le collisioni tra transazioni si verificheranno raramente; Si dice che si sia verificato un conflitto quando un'altra transazione viene aggiornata o eliminata una riga di dati tra il momento in cui viene letta dalla transazione corrente e l'ora in cui viene aggiornata o eliminata. È l'opposto della concorrenza pessimistica o del blocco, in cui lo sviluppatore di applicazioni ritiene che tali collisioni siano comuni.
Nella concorrenza ottimistica, una riga viene lasciata sbloccata finché non arriva il momento di aggiornarla o eliminarla. A questo punto, la riga viene rilettura e controllata per verificare se è stata modificata dopo l'ultima lettura. Se la riga è stata modificata, l'aggiornamento o l'eliminazione ha esito negativo e deve essere riprovato.
Per determinare se una riga è stata modificata, la nuova versione viene verificata in base a una versione memorizzata nella cache della riga. Questo controllo può essere basato sulla versione della riga, ad esempio la colonna timestamp in SQL Server o i valori di ogni colonna nella riga. Molti DBMS non supportano le versioni di riga.
La concorrenza ottimistica può essere implementata dall'origine dati o dall'applicazione. In entrambi i casi, l'applicazione deve usare un livello di isolamento delle transazioni basso, ad esempio Read Committed; l'uso di un livello superiore nega l'aumento della concorrenza ottenuta usando la concorrenza ottimistica.
Se la concorrenza ottimistica viene implementata dall'origine dati, l'applicazione imposta l'attributo dell'istruzione SQL_ATTR_CONCURRENCY su SQL_CONCUR_ROWVER o SQL_CONCUR_VALUES. Per aggiornare o eliminare una riga, esegue una istruzione di aggiornamento o eliminazione posizionata oppure invoca SQLSetPos proprio come farebbe con la concorrenza pessimistica; il driver o la sorgente dati restituisce SQLSTATE 01001 (conflitto dell'operazione del cursore) se l'aggiornamento o l'eliminazione fallisce a causa di un conflitto.
Se l'applicazione stessa implementa la concorrenza ottimistica, imposta l'attributo dell'istruzione SQL_ATTR_CONCURRENCY su SQL_CONCUR_READ_ONLY per leggere una riga. Se il sistema confronta le versioni di riga e non conosce la colonna della versione di riga, chiama SQLSpecialColumns usando l'opzione SQL_ROWVER per determinare il nome della colonna.
L'applicazione aggiorna o elimina la riga aumentando la concorrenza a SQL_CONCUR_LOCK (per ottenere l'accesso in scrittura alla riga) ed eseguendo un'istruzione UPDATE o DELETE con una clausola WHERE che specifica la versione o i valori della riga quando l'applicazione la legge. Se la riga è stata modificata da allora, il comando fallirà. Se la clausola WHERE non identifica in modo univoco la riga, l'istruzione potrebbe anche aggiornare o eliminare altre righe; le versioni di riga identificano sempre in modo univoco le righe, ma i valori di riga identificano in modo univoco le righe solo se includono la chiave primaria.