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 è la capacità di due transazioni di usare contemporaneamente gli stessi dati e, con un maggiore isolamento delle transazioni, in genere si riduce la concorrenza. Questo avviene perché l'isolamento delle transazioni viene in genere implementato bloccando le righe e, man mano che sono bloccate più righe, è possibile completare meno transazioni senza essere bloccate almeno temporaneamente da una riga bloccata. Sebbene la concorrenza ridotta venga generalmente accettata come compromesso per i livelli di isolamento delle transazioni più elevati necessari per mantenere l'integrità del database, può diventare un problema nelle applicazioni interattive con attività di lettura/scrittura elevate che usano cursori.
Si supponga, ad esempio, che un'applicazione esempli l'istruzione SQL SELECT * FROM Orders. Chiama SQLFetchScroll per scorrere il set di risultati e consente all'utente di aggiornare, eliminare o inserire ordini. Dopo che l'utente aggiorna, elimina o inserisce un ordine, l'applicazione esegue il commit della transazione.
Se il livello di isolamento è Repeatable Read, la transazione potrebbe, a seconda della modalità di implementazione, bloccare ogni riga restituita da SQLFetchScroll. Se il livello di isolamento è serializzabile, la transazione potrebbe bloccare l'intera tabella Orders. In entrambi i casi, la transazione rilascia i blocchi solo quando viene eseguito il commit o il rollback. Pertanto, se l'utente impiega molto tempo a leggere gli ordini e molto poco tempo ad aggiornare, eliminare o inserire tali ordini, la transazione potrebbe bloccare facilmente un numero elevato di righe, rendendole non disponibili ad altri utenti.
Si tratta di un problema anche se il cursore è di sola lettura e l'applicazione consente all'utente di leggere solo gli ordini esistenti. In questo caso, l'applicazione esegue il commit della transazione e rilascia i blocchi, quando chiama SQLCloseCursor (in modalità commit automatico) o SQLEndTran (in modalità di commit manuale).
Questa sezione contiene i seguenti argomenti: