Si ritiene comunemente che, nella modalità di esecuzione asincrona, non sia possibile cominciare ad eseguire un'istanza
SQLStatement
se allo stesso momento è in esecuzione un'altra SQLStatement sulla connessione allo stesso database. Si tratta in realtà di un'informazione errata. Mentre è in esecuzione un'istanza SQLStatement non è possibile modificare la proprietà
text
dell'istruzione. Tuttavia, se si utilizza un'istanza SQLStatement separata per ciascuna diversa istruzione SQL che si desidera eseguire, è possibile chiamare il metodo
execute()
di un'istanza SQLStatement mentre un'altra è ancora in esecuzione, senza che ciò dia luogo a un errore.
All'interno, quando si eseguono le operazioni sul database nella modalità asincrona, ciascuna connessione al database (cioè ciascuna istanza
SQLConnection
) ha una propria coda o elenco di operazioni che deve eseguire. Il runtime esegue ciascuna operazione in serie, nell'ordine in cui viene aggiunta alla coda. Quando si crea un'istanza SQLStatement e si chiama il corrispondente metodo
execute()
, tale operazione di esecuzione dell'istruzione viene aggiunta alla coda della connessione. Se su tale istanza SQLConnection non è al momento in esecuzione nessuna operazione, l'istruzione comincia ad essere eseguita in background. Supponiamo di creare, all'interno dello stesso blocco di codice, un'altra istanza SQLStatement e inoltre di chiamare il corrispondente metodo
execute()
. L'operazione di esecuzione della seconda istruzione viene aggiunta alla coda dopo la prima istruzione. Non appena la prima istruzione finisce di essere eseguita, il runtime passa alla successiva operazione nella coda. L'elaborazione delle operazioni successive della coda avviene in background anche mentre l'evento
result
della prima operazione è ancora in corso di creazione nel codice dell'applicazione principale. Questa tecnica è dimostrata nel codice seguente.
// 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.
Il fatto che il database esegue automaticamente le istruzioni successive presenti in coda produce un effetto collaterale importante. Se un'istruzione dipende dal risultato di un'altra operazione, non è possibile aggiungere l'istruzione alla coda (cioè non si può chiamare il corrispondente metodo
execute()
) finché la prima operazione non è stata completata. Ciò accade perché, una volta che si è chiamato il metodo
execute()
della seconda istruzione, non è possibile modificare le proprietà
text
e
parameters
dell'istruzione stessa. In tal caso è necessario attendere l'evento che indica il completamento della prima operazione prima di dare inizio all'operazione successiva. Se ad esempio desiderate eseguire un'istruzione nell'ambito di una transazione, l'esecuzione dell'istruzione dipenderà dall'operazione di apertura della transazione. Dopo aver chiamato il metodo
SQLConnection.begin()
per aprire la transazione, sarà necessario attendere che l'istanza SQLConnection crei il suo evento
begin
. Solo allora sarà possibile chiamare il metodo
execute()
dell'istanza SQLStatement. In questo esempio, il modo più semplice di organizzare l'applicazione in modo da assicurare la corretta esecuzione delle operazioni è quello di creare un metodo registrato come listener dell'evento
begin
. Il codice che chiama il metodo
SQLStatement.execute()
viene posto all'interno di tale metodo listener.