Поделиться через


Влияние транзакций на курсоры и подготовленные инструкции

Фиксация или откат транзакции имеет одно из следующих последствий для курсоров и планов доступа:

  • Все курсоры закрыты, а планы доступа для подготовленных инструкций по этому подключению удаляются или

  • Все курсоры закрыты, а планы доступа для подготовленных инструкций по этому подключению остаются неизменными или

  • Все курсоры остаются открытыми, а планы доступа для подготовленных инструкций по этому подключению остаются неизменными.

Например, предположим, что источник данных демонстрирует первое поведение в этом списке, самое строгое из этих действий. Теперь предположим, что приложение выполняет следующее:

  1. Задает режим фиксации для ручной фиксации.

  2. Создает результирующий набор заказов на продажу по оператору 1.

  3. Создает результирующий набор строк в заказе на продажу по оператору 2, когда пользователь выделяет этот заказ.

  4. Вызывает SQLExecute , чтобы выполнить позиционированную инструкцию обновления, подготовленную на операторе 3, когда пользователь обновляет строку.

  5. Вызывает SQLEndTran , чтобы зафиксировать позиционированную инструкцию обновления.

Из-за поведения источника данных вызов SQLEndTran на шаге 5 приводит к закрытию курсоров инструкций 1 и 2 и удалению плана доступа для всех инструкций. Приложение должно повторно использовать операторы 1 и 2 для повторного создания результирующих наборов и повторной настройки инструкции на операторе 3.

В режиме автоматической фиксации функции, отличные от транзакций фиксации SQLEndTran :

  • SQLExecute или SQLExecDirect В предыдущем примере вызов SQLExecute на шаге 4 фиксирует транзакцию. Это приводит к закрытию курсоров на операторах 1 и 2 и удалении плана доступа ко всем операторам этого подключения.

  • SQLBulkOperations или SQLSetPos В предыдущем примере предположим, что на шаге 4 приложение вызывает SQLSetPos с параметром SQL_UPDATE инструкции 2, а не выполнять позиционированную инструкцию обновления по инструкции 3. Это фиксирует транзакцию и приводит к закрытию курсоров на операторах 1 и 2 и отключено карта все планы доступа в этом подключении.

  • SQLCloseCursor В предыдущем примере предположим, что при выделении пользователем другого заказа на продажу приложение вызывает SQLCloseCursor на операторе 2 перед созданием результата строк для нового заказа на продажу. Вызов SQLCloseCursor фиксирует инструкцию SELECT, которая создала результирующий набор строк и приводит к закрытию источника данных курсора на операторе 1, а затем отключает карта все планы доступа в этом соединении.

Приложения, особенно приложения на основе экрана, в которых пользователь прокручивает результирующий набор и обновляет или удаляет строки, должны быть осторожны в коде вокруг этого поведения.

Чтобы определить поведение источника данных при фиксации или откате транзакции, приложение вызывает SQLGetInfo с параметрами SQL_CURSOR_COMMIT_BEHAVIOR и SQL_CURSOR_ROLLBACK_BEHAVIOR.