Noções básicas sobre o modelo de execução assíncrona

Adobe AIR 1.0 e posterior

Uma preocupação comum sobre o uso do modo de execução assíncrona é a suposição de que não é possível começar a executar uma instância de SQLStatement se outra instância de SQLStatement está em execução na mesma conexão de banco de dados. Na verdade, essa suposição não está correta. Durante a execução de uma ocorrência de SQLStatement, não é possível alterar a propriedade text da instrução. Contudo, se você usar uma ocorrência de SQLStatement à parte para cada instrução SQL que deseja executar, poderá chamar o método execute() de um SQLStatement enquanto outra ocorrência de SQLStatement ainda estiver sendo executada, sem causar erro.

Internamente, quando você executa operações de banco de dados utilizando o modo de execução assíncrona, cada conexão de banco de dados (cada instância de SQLConnection ) tem sua própria fila ou lista de operações que está instruída a executar. O tempo de execução realiza cada operação em sequência, na ordem em que são adicionadas à fila. Quando você cria uma ocorrência de SQLStatement e chama o método execute() relacionado, a operação de execução dessa instrução é adicionada à fila da conexão. Se nenhuma operação estiver sendo executada nessa ocorrência de SQLConnection, a instrução começará a ser executada em segundo plano. Suponha que, dentro do mesmo bloco de código, você crie outra ocorrência de SQLStatement e também chame o método execute() daquele método. A operação que executa essa segunda instrução é adicionada à fila depois da primeira instrução. Assim que é concluída a execução da primeira instrução, o tempo de execução passa para a próxima operação da fila. O processamento das operações subsequentes na fila acontece em segundo plano, mesmo quando o evento result da primeira operação está sendo despachado no código do aplicativo principal. O código abaixo demonstra 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. 

Ocorre um importante efeito colateral pelo fato de o banco de dados executar as próximas instruções em fila de maneira automática. Se uma instrução depende do resultado de outra operação, não é possível adicioná-la à fila (em outras palavras, você não pode chamar o método execute() relacionado) até a primeira operação ser concluída. Isso acontece porque, depois que você chamou o método execute() da segunda instrução, não é possível alterar as propriedades text ou parameters dela. Nesse caso, você deve aguardar o evento indicando que a primeira operação foi concluída antes de iniciar a próxima operação. Por exemplo, se você quiser executar uma instrução no contexto de uma transação, a execução da instrução dependerá da operação de abrir a transação. Após chamar o método SQLConnection.begin() para abrir a transação, você terá de aguardar que a ocorrência de SQLConnection despache seu evento begin . Só então você poderá chamar o método execute() da ocorrência de SQLStatement. Neste exemplo, o modo mais simples de organizar o aplicativo para assegurar que as operações sejam executadas corretamente é criar um método que seja registrado como ouvinte do evento begin . O código para chamar o método SQLStatement.execute() é colocado dentro do método desse ouvinte.