Freigeben über


Auswirkungen von Transaktionen auf Cursor und vorbereitete Anweisungen

Das Commit oder Rollback einer Transaktion hat einen der folgenden Auswirkungen auf Cursor und Zugriffspläne:

  • Alle Cursor sind geschlossen, und Zugriffspläne für vorbereitete Anweisungen zu dieser Verbindung werden gelöscht oder

  • Alle Cursor sind geschlossen, und Zugriffspläne für vorbereitete Anweisungen zu dieser Verbindung sind intakt Standard oder

  • Alle Cursor wieder Standard geöffnet und greifen auf Pläne für vorbereitete Anweisungen für diese Verbindung zurück Standard intakt.

Angenommen, eine Datenquelle zeigt das erste Verhalten in dieser Liste, die restriktivsten dieser Verhaltensweisen. Angenommen, eine Anwendung führt folgendes aus:

  1. Legt den Commitmodus auf manuellen Commit fest.

  2. Erstellt einen Resultset von Verkaufsaufträgen in Anweisung 1.

  3. Erstellt einen Resultset der Zeilen in einer Verkaufsbestellung in Anweisung 2, wenn der Benutzer diese Bestellung hervorhebung.

  4. Ruft SQLExecute auf, um eine positionierte Updateanweisung auszuführen, die auf Anweisung 3 vorbereitet wurde, wenn der Benutzer eine Zeile aktualisiert.

  5. Ruft SQLEndTran auf, um die positionierte Updateanweisung zu übernehmen.

Aufgrund des Verhaltens der Datenquelle bewirkt der Aufruf von SQLEndTran in Schritt 5, dass er die Cursor in Den Anweisungen 1 und 2 schließt und den Zugriffsplan für alle Anweisungen löscht. Die Anwendung muss anweisungen 1 und 2 erneut ausführen, um die Resultsets erneut zu erstellen und die Anweisung für Anweisung 3 erneut zu erstellen.

Im Auto-Commit-Modus übernehmen andere Funktionen als SQLEndTran Commit-Transaktionen:

  • SQLExecute oder SQLExecDirect Im vorherigen Beispiel wird durch den Aufruf von SQLExecute in Schritt 4 eine Transaktion ausgeführt. Dies bewirkt, dass die Datenquelle die Cursor in Den Anweisungen 1 und 2 schließt und den Zugriffsplan für alle Anweisungen in dieser Verbindung löscht.

  • SQLBulkOperations oder SQLSetPos Im vorherigen Beispiel wird angenommen, dass in Schritt 4 die Anwendung SQLSetPos mit der Option SQL_UPDATE für Anweisung 2 aufruft, anstatt eine positionierte Aktualisierungsanweisung für Anweisung 3 auszuführen. Dadurch wird ein Commit für eine Transaktion ausgeführt und bewirkt, dass die Datenquelle die Cursor in den Anweisungen 1 und 2 schließt und Karte alle Zugriffspläne für diese Verbindung dis.

  • SQLCloseCursor Im vorherigen Beispiel angenommen, dass die Anwendung SQLCloseCursor in Anweisung 2 aufruft, wenn der Benutzer eine andere Verkaufsbestellung hervorhebung, bevor ein Ergebnis der Zeilen für den neuen Verkaufsauftrag erstellt wird. Der Aufruf von SQLCloseCursor führt einen Commit für die SELECT-Anweisung durch, die das Resultset von Zeilen erstellt hat, und bewirkt, dass die Datenquelle den Cursor in Anweisung 1 schließt und dann alle Zugriffspläne für diese Verbindung ab Karte hebt.

Anwendungen, insbesondere bildschirmbasierte Anwendungen, in denen der Benutzer um das Resultset scrollt und Zeilen aktualisiert oder löscht, müssen darauf achten, dass Code um dieses Verhalten herum ausgeführt wird.

Um zu bestimmen, wie sich eine Datenquelle verhält, wenn eine Transaktion zugesichert oder zurückgesetzt wird, ruft eine Anwendung SQLGetInfo mit den Optionen SQL_CURSOR_COMMIT_BEHAVIOR und SQL_CURSOR_ROLLBACK_BEHAVIOR auf.