Ein häufig geäußerter Vorbehalt gegenüber dem asynchronen Ausführungsmodus ist die Annahme, dass eine
SQLStatement
-Instanz nicht ausgeführt werden kann, solange noch eine andere SQLStatement-Instanz für dieselbe Datenbankverbindung ausgeführt wird. Diese Annahme ist jedoch falsch. Während eine SQLStatement-Instanz ausgeführt wird, können Sie die
text
-Eigenschaft dieser Anweisung nicht ändern. Wenn Sie jedoch für jede SQL-Anweisung, die Sie ausführen möchten, eine separate SQLStatement-Instanz verwenden, können Sie die
execute()
-Methode einer SQLStatement-Instanz aufrufen, während eine andere SQLStatement-Instanz noch ausgeführt wird, ohne dass es zu einem Fehler kommt.
Intern hat beim asynchronen Ausführen von Datenbankoperationen jede Datenbankverbindung (jede
SQLConnection
-Instanz) ihre eigene Warteschlange oder Liste mit Operationen, die sie ausführen soll. Die Laufzeitumgebung führt die einzelnen Operationen in der Reihenfolge aus, in der sie der Warteschlange hinzugefügt wurden. Wenn Sie eine SQLStatement-Instanz erstellen und deren
execute()
-Methode aufrufen, wird die Ausführungsoperation dieser Anweisung der Warteschlange für diese Verbindung hinzugefügt. Wird zurzeit keine Operation für diese SQLConnection-Instanz ausgeführt, beginnt die Anweisung im Hintergrund mit der Ausführung. Angenommen, Sie erstellen innerhalb desselben Codeblocks eine weitere SQLStatement-Instanz und rufen deren
execute()
-Methode auf. Diese zweite Ausführungsoperation wird der Warteschlange nach der ersten Anweisung hinzugefügt. Sobald die Ausführung der ersten Anweisung abgeschlossen ist, fährt die Laufzeitumgebung mit der nächsten Operation in der Warteschlange fort. Die Verarbeitung nachfolgender Operationen in der Warteschlange erfolgt im Hintergrund, während das
result
-Ereignis für die erste Operation im Hauptanwendungscode ausgelöst wird. Diese Vorgehensweise wird im folgenden Codebeispiel veranschaulicht:
// Using asynchronous execution mode
var stmt1:SQLStatement = new SQLStatement();
stmt1.sqlConnection = conn;
// ... Set statement text and parameters, and register event listeners ...
stmt1.execute();
// At this point stmt1's execute() operation is added to conn's execution queue.
var stmt2:SQLStatement = new SQLStatement();
stmt2.sqlConnection = conn;
// ... Set statement text and parameters, and register event listeners ...
stmt2.execute();
// At this point stmt2's execute() operation is added to conn's execution queue.
// When stmt1 finishes executing, stmt2 will immediately begin executing
// in the background.
Die automatische Ausführung der Operationen in der Warteschlange durch die Datenbank hat einen wichtigen Nebeneffekt. Wenn eine Anweisung vom Ergebnis einer anderen Operation abhängig ist, können Sie die Anweisung nicht der Warteschlange hinzufügen (anders ausgedrückt, Sie können deren
execute()
-Methode nicht aufrufen), bevor die erste Operation abgeschlossen ist. Dies liegt daran, dass Sie nach dem Aufrufen der
execute()
-Methode der zweiten Anweisung die Eigenschaften
text
oder
parameters
der Anweisung nicht mehr ändern können. In diesem Fall müssen Sie auf das Ereignis, das den Abschluss der ersten Operation meldet, warten, bevor Sie mit der nächsten Operation beginnen können. Wenn Sie zum Beispiel eine Anweisung im Kontext einer Transaktion ausführen möchten, ist die Ausführung der Anweisung von der Operation abhängig, die die Transaktion öffnet. Nachdem Sie die
SQLConnection.begin()
-Methode aufgerufen haben, um mit der Transaktion zu beginnen, müssen Sie warten, bis die SQLConnection-Instanz das
begin
-Ereignis auslöst. Erst dann können Sie die
execute()
-Methode der SQLStatement-Instanz aufrufen. In diesem Beispiel ist es für die richtige Ausführung der Operationen am einfachsten, wenn Sie eine Methode erstellen, die als Listener für das
begin
-Ereignis registriert ist. Der Code, mit dem die
SQLStatement.execute()
-Methode aufgerufen wird, wird innerhalb dieser Listener-Methode platziert.