Les développeurs partent souvent du principe qu’en mode asynchrone, il est impossible de lancer l’exécution d’une occurrence de
SQLStatement
lorsqu’une autre occurrence de SQLStatement est déjà en cours d’exécution sur la même connexion de base de données. En fait, cette hypothèse est fausse. Lorsqu’une occurrence de SQLStatement s’exécute, vous ne pouvez pas modifier la propriété
text
de l’instruction. Toutefois, si vous utilisez une occurrence de SQLStatement distincte pour chaque instruction SQL à exécuter, vous pouvez appeler la méthode
execute()
d’une occurrence de SQLStatement pendant l’exécution d’une autre sans provoquer d’erreur.
Lorsque vous exécutez en interne des opérations de base de données en mode asynchrone, chaque connexion de base de données (chaque occurrence de
SQLConnection
) possède sa propre file d’attente ou liste d’opérations à exécuter. Le moteur d’exécution effectue chaque opération l’une après l’autre, selon leur ordre d’apparition dans la file d’attente. Lorsque vous créez une occurrence de SQLStatement et appelez sa méthode
execute()
, cette opération d’exécution d’instruction est ajoutée à la file d’attente de la connexion. Si aucune opération n’est en cours d’exécution sur cette occurrence de SQLConnection, l’exécution de l’instruction commence en arrière-plan. Supposons maintenant, que dans le même bloc de code, vous créiez une autre occurrence de SQLStatement et appeliez sa méthode
execute()
. Cette seconde opération d’exécution d’instruction est ajoutée à la file d’attente derrière la première instruction. Dès que l’exécution de la première instruction est terminée, le moteur d’exécution passe à la prochaine opération de la file d’attente. Le traitement des opérations successives de la file d’attente s’effectue en arrière-plan, même lorsque l’événement
result
de la première opération est déclenché dans le code de l’application principale. Le code suivant illustre cette technique :
// 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.
L’exécution automatique des instructions successives en attente a un effet secondaire important pour la base de données. Lorsqu’une instruction dépend du résultat d’une autre opération, vous ne pouvez pas l’ajouter en file d’attente (en d’autres termes, vous ne pouvez pas appeler sa méthode
execute()
) avant que la première opération ne soit terminée. La raison en est qu’après avoir appelé la méthode
execute()
de la seconde instruction, vous ne pouvez plus modifier les propriétés
text
et
parameters
de l’instruction. Dans ce cas, vous devez attendre l’événement indiquant que la première opération est terminée avant de commencer la suivante. Par exemple, si vous souhaitez exécuter une instruction dans le contexte d’une transaction, l’exécution de cette instruction dépend de l’opération d’ouverture de la transaction. Après l’appel à la méthode
SQLConnection.begin()
pour ouvrir la transaction, vous devez attendre que l’occurrence de SQLConnection déclenche son événement
begin
. A ce stade seulement vous pouvez appeler la méthode
execute()
de l’occurrence de SQLStatement. Dans cet exemple, le moyen le plus simple d’organiser l’application pour s’assurer que les opérations s’exécutent correctement consiste à créer une méthode enregistrée en tant qu’écouteur de l’événement
begin
. Le code qui appelle la méthode
SQLStatement.execute()
est placé dans cette méthode d’écouteur.