Typowym problemem związanym z trybem wykonywania asynchronicznego jest brak możliwości uruchomienia instancji
SQLStatement
, jeśli wykonywana jest inna instancja klasy SQLStatement dla tego samego połączenia z bazą danych. W rzeczywistości założenie takiego działania jest niepoprawne. Podczas działania instancji klasy SQLStatement nie ma możliwości zmiany właściwości
text
instrukcji. Jeśli jednak używana jest osobna instancja klasy SQLStatement dla każdej innej instrukcji SQL, która ma zostać wykonana, wówczas należy wywołać metodę
execute()
klasy SQLStatement podczas wykonywania innej instancji SQLStatement i nie spowoduje to błędu.
Podczas wykonywania operacji na bazie danych przy użyciu trybu wykonywania asynchronicznego każde połączenie z bazą danych (każda instancja
SQLConnection
) ma własną kolejkę lub listę operacji, które ma wykonywać. Środowisko wykonawcze wykonuje operacje w kolejności, w jakiej są dodawane do kolejki. Po utworzeniu instancji klasy SQLStatement i wywołaniu jej metody
execute()
ta operacja wykonania instrukcji zostaje dodana do kolejki połączenia. Jeśli żadna operacja nie jest aktualnie wykonywana na instancji klasy SQLConnection, wówczas wykonanie instrukcji rozpoczyna się w tle. Załóżmy, że w jednym bloku kodu utworzona zostaje inna instancja klasy SQLStatement, a ponadto zostaje wywołana metoda
execute()
tej metody. Operacja wykonania drugiej instrukcji zostanie dodana do kolejki po pierwszej instrukcji. Gdy zakończy się wykonywanie pierwszej instrukcji, środowisko wykonawcze przechodzi do kolejnej operacji w kolejce. Przetwarzanie kolejnych operacji w kolejce odbywa się w tle, nawet jeśli zdarzenie
result
dla pierwszej operacji zostanie wywołane w głównym kodzie aplikacji. Poniższy kod prezentuje tę technikę:
// 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.
Istnienie istotny skutek automatycznego wykonywania przez bazę danych kolejnych instrukcji z kolejki. Jeśli instrukcja jest uzależniona od wyniku innej operacji, instrukcji nie można dodać do kolejki (innymi słowy: nie można wywołać jej metody
execute()
) do czasu zakończenia pierwszej operacji. Dzieje się tak, ponieważ po wywołaniu metody
execute()
drugiej instrukcji nie można zmienić właściwości
text
ani
parameters
instrukcji. W takim przypadku należy oczekiwać na zdarzenie wskazujące zakończenie pierwszej operacji — dopiero wówczas można uruchomić kolejną operację. Na przykład: jeśli wymagane jest wykonanie instrukcji w kontekście transakcji, instrukcja jest uzależniona od operacji otwarcia transakcji. Po wywołaniu metody
SQLConnection.begin()
w celu otwarcia transakcji należy odczekać, aż instancja klasy SQLConnection wywoła zdarzenie
begin
. Tylko wówczas można wywołać metodę
execute()
instancji klasy SQLStatement. W tym przykładzie najprostszym sposobem na zorganizowanie aplikacji w celu zapewnienia, że operacje są wykonywane poprawnie, jest utworzenie metody, która zostanie zarejestrowana jako detektor zdarzenia
begin
. Kod metody
SQLStatement.execute()
zostanie umieszczony w metodzie detektora.