Condividi tramite


Keyset-Driven cursori

Un cursore basato su keyset si trova tra un cursore statico e un cursore dinamico nella sua capacità di rilevare le modifiche. Come un cursore statico, non rileva sempre le modifiche all'appartenenza e all'ordine del set di risultati. Analogamente a un cursore dinamico, rileva le modifiche ai valori delle righe nel set di risultati (soggetto al livello di isolamento della transazione, come impostato dall'attributo di connessione SQL_ATTR_TXN_ISOLATION).

Quando viene aperto un cursore basato su keyset, salva le chiavi per l'intero set di risultati; questo consente di correggere l'appartenenza apparente e l'ordine del set di risultati. Quando il cursore scorre il set di risultati, usa le chiavi in questo keyset per recuperare i valori di dati correnti per ogni riga. Si supponga, ad esempio, che un cursore basato su keyset recuperi una riga e un'altra applicazione aggiorni tale riga. Se il cursore recupera la riga, i valori visualizzati sono quelli nuovi perché recupera la riga usando la relativa chiave. Per questo motivo, i cursori basati su keyset rilevano sempre le modifiche apportate da se stessi e da altri.

Quando il cursore tenta di recuperare una riga eliminata, questa riga viene visualizzata come "foro" nel set di risultati: la chiave per la riga esiste nel keyset, ma la riga non esiste più nel set di risultati. Se i valori chiave di una riga vengono aggiornati, la riga viene considerata eliminata e quindi inserita, pertanto tali righe vengono visualizzate anche come fori nel set di risultati. Anche se un cursore basato su keyset può sempre rilevare le righe eliminate da altri utenti, può facoltativamente rimuovere le chiavi per le righe che elimina se stesso dal keyset. I cursori basati su keyset che eseguono questa operazione non possono rilevare le proprie eliminazioni. Se un particolare cursore guidato da keyset rileva le proprie cancellazioni, viene segnalato tramite l'opzione SQL_STATIC_SENSITIVITY in SQLGetInfo.

Le righe inserite da altri utenti non sono mai visibili a un cursore basato su keyset perché non esistono chiavi per queste righe nel keyset. Tuttavia, un cursore basato su keyset può facoltativamente aggiungere al keyset le chiavi per le righe che inserisce esso stesso. I cursori basati su keyset che eseguono questa operazione possono rilevare i propri inserimenti. Indica se un determinato cursore guidato da keyset rileva i propri inserimenti, ed è segnalato tramite l'opzione SQL_STATIC_SENSITIVITY in SQLGetInfo.

La matrice di stato della riga specificata dall'attributo dell'istruzione SQL_ATTR_ROW_STATUS_PTR può contenere SQL_ROW_SUCCESS, SQL_ROW_SUCCESS_WITH_INFO o SQL_ROW_ERROR per qualsiasi riga. Restituisce SQL_ROW_UPDATED, SQL_ROW_DELETED o SQL_ROW_ADDED per le righe rilevate come aggiornate, eliminate o inserite.

I cursori basati su keyset vengono comunemente implementati creando una tabella temporanea contenente le chiavi per ogni riga nel set di risultati. Poiché il cursore deve anche determinare se le righe sono state aggiornate, questa tabella contiene in genere anche una colonna con informazioni sul controllo delle versioni delle righe.

Per scorrere il set di risultati originale, il cursore basato su keyset apre un cursore statico sulla tabella temporanea. Per recuperare una riga nel set di risultati originale, il cursore recupera prima la chiave appropriata dalla tabella temporanea e quindi recupera i valori correnti per la riga. Se vengono utilizzati cursori di blocco, il cursore deve recuperare più chiavi e righe.