Una preocupación común acerca del uso del modo de ejecución asíncrono es la suposición de que no se puede comenzar a ejecutar una instancia de
SQLStatement
si otra instancia de SQLStatement se está ejecutando con la misma conexión de base de datos. De hecho, esta suposición no es correcta. Mientras que se ejecuta una instancia SQLStatement no se puede cambiar la propiedad
text
de la declaración. Sin embargo, si se utiliza una instancia SQLStatement por separado para cada declaración SQL diferente que se desea ejecutar, se puede llamar al método
execute()
de una instancia SQLStatement mientras otra instancia SQLStatement aún se está ejecutando, sin generar un error.
Internamente, cuando se ejecutan operaciones de base de datos usando el modo de ejecución asíncrono, cada conexión de base de datos (cada instancia de
SQLConnection
) tiene su propia cola o lista de operaciones que debe llevar a cabo. El motor de ejecución ejecuta cada operación en secuencia, en el orden en que se añaden a la cola. Cuando se crea una instancia SQLStatement y se llama al método
execute()
, esa operación de ejecución de la declaración se añade a la cola para la conexión. Si no se está ejecutando ninguna operación en esa instancia SQLConnection, la declaración comienza la ejecución en segundo plano. Supongamos que dentro del mismo bloque de código crea otra instancia SQLStatement y también llama al método
execute(()
. Esa segunda operación de ejecución de la declaración se añade a la cola detrás de la primera declaración. En cuanto termina la ejecución de la primera declaración, el motor de ejecución se traslada a la siguiente operación en la cola. El procesamiento de las operaciones posteriores en la cola ocurre en segundo plano, aun cuando el evento
result
para la primera operación se está distribuyendo en el código la aplicación principal. En el siguiente código se demuestra esta técnica:
// 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.
Hay un efecto colateral importante si la base de datos ejecuta automáticamente declaraciones posteriores en la cola. Si una declaración depende del resultado de otra operación, no se puede añadir la declaración a la cola (es decir, no se puede llamar al método
execute()
) hasta que la primera operación se complete. Esto se debe a que una vez que se ha llamado al método
execute()
de la segunda declaración no se pueden cambiar las propiedades
text
o
parameters
de la instrucción. En ese caso se debe esperar a que el evento indique que la primera operación está completada antes de comenzar con la siguiente operación. Por ejemplo, si desea ejecutar una declaración en el contexto de una transacción, la ejecución de la declaración depende de la operación de abrir la transacción. Después de llamar al método
SQLConnection.begin()
para abrir la transacción, necesita esperar a que la instancia SQLConnection distribuya el evento
begin
. Solo entonces puede llamar al método
execute()
de la instancia SQLStatement. En este ejemplo la manera más fácil de organizar la aplicación para asegurar que las operaciones se ejecutan correctamente es crear un método que está registrado como un detector para el evento
begin
. El código para llamar al método
SQLStatement.execute()
se coloca dentro del método del detector.