Freigeben über


Ausführen von Commits und Rollbacks von Transaktionen

Um eine Transaktion im manuellen Commitmodus zu übernehmen oder zurückzunehmen, ruft eine Anwendung SQLEndTran auf. Treiber für DBMSs, die Transaktionen unterstützen, implementieren diese Funktion in der Regel durch Ausführen einer COMMIT- oder ROLLBACK-Anweisung . Der Treiber-Manager ruft SQLEndTran nicht auf, wenn sich die Verbindung im Automatischen Commit-Modus befindet. Er gibt einfach SQL_SUCCESS zurück, auch wenn die Anwendung versucht, die Transaktion zurückzurufen. Da Treiber für DBMSs, die Transaktionen nicht unterstützen, immer im Auto-Commit-Modus ausgeführt werden, können sie SQLEndTran entweder implementieren, um SQL_SUCCESS zurückzugeben, ohne sie überhaupt zu implementieren.

Hinweis

Anwendungen sollten keine Commit- oder Rollback-Transaktionen ausführen, indem COMMIT- oder ROLLBACK-Anweisungen mit SQLExecute oder SQLExecDirect ausgeführt werden. Die Auswirkungen dieser Aktion sind nicht definiert. Mögliche Probleme sind der Treiber, der nicht mehr weiß, wann eine Transaktion aktiv ist, und diese Anweisungen schlagen gegen Datenquellen fehl, die Transaktionen nicht unterstützen. Diese Anwendungen sollten stattdessen SQLEndTran aufrufen.

Wenn eine Anwendung das Umgebungshandle an SQLEndTran übergibt, aber kein Verbindungshandle übergibt, ruft der Treiber-Manager SQLEndTran mit dem Umgebungshandle für jeden Treiber mit mindestens einer aktiven Verbindung in der Umgebung auf. Der Treiber führt dann einen Commit für die Transaktionen für jede Verbindung in der Umgebung durch. Es ist jedoch wichtig zu erkennen, dass weder der Treiber noch der Treiber-Manager einen zweistufigen Commit für die Verbindungen in der Umgebung ausführen; Dies ist lediglich eine Programmierfreundlichkeit, um SQLEndTran für alle Verbindungen in der Umgebung gleichzeitig aufzurufen.

(Ein zweistufiger Commit wird in der Regel verwendet, um Transaktionen zu übernehmen , die über mehrere Datenquellen verteilt sind. In der ersten Phase werden die Datenquellen abgefragt, ob sie ihren Teil der Transaktion übernehmen können. In der zweiten Phase wird die Transaktion tatsächlich für alle Datenquellen zugesichert. Wenn Datenquellen in der ersten Phase antworten, dass sie die Transaktion nicht übernehmen können, tritt die zweite Phase nicht auf.)