Condividi tramite


Effetto delle transazioni sui cursori e sulle istruzioni preparate

Eseguire il commit o il rollback di una transazione ha uno dei seguenti effetti sui cursori e sui piani di accesso:

  • Tutti i cursori vengono chiusi e i piani di accesso per le istruzioni preparate su tale connessione vengono eliminati o

  • Tutti i cursori vengono chiusi e i piani di accesso per le istruzioni preparate su tale connessione rimangono intatti o

  • Tutti i cursori rimangono aperti e i piani di accesso per le istruzioni preparate su tale connessione rimangono intatti.

Si supponga, per esempio, che un'origine dati mostri il primo comportamento di questo elenco, il più restrittivo. Si supponga ora che un'applicazione esegua le seguenti operazioni:

  1. Imposta la modalità commit su commit manuale.

  2. Crea un set di risultati di ordini cliente nell'istruzione 1.

  3. Crea un set di risultati delle righe in un ordine cliente nell'istruzione 2, quando l'utente evidenzia tale ordine.

  4. Chiama SQLExecute per eseguire un'istruzione di aggiornamento posizionato che è stata preparata nell'istruzione 3, quando l'utente aggiorna una riga.

  5. Chiama SQLEndTran per eseguire il commit dell'istruzione aggiornamento posizionato.

A causa del comportamento dell'origine dati, la chiamata a SQLEndTran nel passaggio 5 comporta la chiusura dei cursori nelle istruzioni 1 e 2 e l'eliminazione del piano di accesso in tutte le istruzioni. L'applicazione deve eseguire nuovamente le istruzioni 1 e 2 per ricreare i set di risultati e ripreparare l'istruzione sull'istruzione 3.

In modalità commit automatico, funzioni diverse da SQLEndTran eseguono il commit delle transazioni:

  • SQLExecute o SQLExecDirect Nell'esempio precedente la chiamata a SQLExecute nel passaggio 4 esegue il commit di una transazione. Questo fa sì che l'origine dati chiuda i cursori nelle istruzioni 1 e 2 ed elimini il piano di accesso in tutte le istruzioni della connessione.

  • SQLBulkOperations o SQLSetPos Nell'esempio precedente, si supponga che nel passaggio 4 l'applicazione chiami SQLSetPos con l'opzione SQL_UPDATE sull'istruzione 2, anziché eseguire un'istruzione aggiornamento posizionato sull'istruzione 3. Questo fa sì che venga eseguito il commit di una transazione e che l'origine dati chiuda i cursori nelle istruzioni 1 e 2, rimuovendo tutti i piani di accesso della connessione.

  • SQLCloseCursor Nell'esempio precedente si supponga che quando l'utente evidenzia un ordine di vendita diverso, l'applicazione chiama SQLCloseCursor sull'istruzione 2 prima di creare un risultato delle righe per il nuovo ordine di vendita. La chiamata a SQLCloseCursor esegue il commit dell'istruzione SELEZIONA che ha creato il set di risultati delle righe e fa sì che l'origine dati chiuda il cursore sull'istruzione 1, eliminando tutti i piani di accesso nella connessione.

Le applicazioni, in particolare quelle basate sullo schermo in cui l'utente scorre intorno al set di risultati e aggiorna o elimina le righe, devono fare attenzione a scrivere il codice intorno a questo comportamento.

Per determinare il comportamento di un'origine dati quando viene eseguito il commit o il rollback di una transazione, un'applicazione chiama SQLGetInfo con le opzioni SQL_CURSOR_COMMIT_BEHAVIOR e SQL_CURSOR_ROLLBACK_BEHAVIOR.