Многие предполагают, что в режиме асинхронного выполнения нельзя начать выполнение экземпляра
SQLStatement
во время выполнения другого экземпляра SQLStatement в отношении одного и того же подключения к базе данных. На самом деле это предположение не совсем верное. Во время выполнения экземпляра SQLStatement невозможно изменить свойство
text
инструкции. Однако при использовании отдельного экземпляра SQLStatement для каждой инструкции SQL, которую нужно выполнить, можно вызвать метод
execute()
экземпляра SQLStatement во время выполнения другого экземпляра SQLStatement, что не приведет к ошибке.
При выполнении операций базы данных в асинхронном режиме каждое подключение базы данных (каждый экземпляр
SQLConnection
) имеет собственную внутреннюю очередь или список операций для выполнения. Среда выполняет операции последовательно в соответствии с порядком их добавления в очередь. При создании экземпляра SQLStatement и вызове его метода
execute()
операция выполнения этой инструкции добавляется в очередь подключения. Если нет выполняемых в данных момент операций для данного экземпляра SQLConnection, инструкция начинает выполняться в фоновом режиме. Предположим, в том же блоке кода создается другой экземпляр SQLStatement и вызывается его метод
execute()
. Операция выполнения второй инструкции ставится в очередь за первой инструкцией. Как только выполнение первой инструкции завершится, среда выполнения перейдет к следующей операции в очереди. Обработка последовательных операций в очереди происходит в фоновом режиме даже во время отправки события
result
первой операции в основной код приложения. Следующий код иллюстрирует такой подход:
// 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.
Автоматическое выполнение базой данных последовательных инструкций в очереди имеет побочный эффект. Если выполнение инструкции зависит от результата выполнения предыдущей операции, невозможно добавить инструкцию в очередь (другими словами, невозможно вызвать ее метод
execute()
), пока не завершится выполнение первой операции. Это происходит потому, что после вызова метода
execute()
второй инструкции становится невозможным изменение свойств
text
или
parameters
этой инструкции. В таком случае необходимо дождаться получения события, указывающего на завершение первой операции, перед началом выполнения последующей операции. Например, если требуется выполнить инструкцию в контексте транзакции, выполнение инструкции зависит от выполнения операции по открытию транзакции. После вызова метода
SQLConnection.begin()
для открытия транзакции необходимо дождаться отправки экземпляром SQLConnection события
begin
. Только после этого можно вызвать метод
execute()
экземпляра SQLStatement. В данном примере самым простым способом проверки правильного выполнения операций является создание метода, который регистрируется в качестве прослушивателя события
begin
. Код для вызова метода
SQLStatement.execute()
вставляется в метод прослушивателя.