Влияние транзакций на курсоры и подготовленные инструкции
Фиксация или откат транзакции имеет одно из следующих последствий для курсоров и планов доступа:
Все курсоры закрыты, а планы доступа для подготовленных инструкций по этому подключению удаляются или
Все курсоры закрыты, а планы доступа для подготовленных инструкций по этому подключению остаются неизменными или
Все курсоры остаются открытыми, а планы доступа для подготовленных инструкций по этому подключению остаются неизменными.
Например, предположим, что источник данных демонстрирует первое поведение в этом списке, самое строгое из этих действий. Теперь предположим, что приложение выполняет следующее:
Задает режим фиксации для ручной фиксации.
Создает результирующий набор заказов на продажу по оператору 1.
Создает результирующий набор строк в заказе на продажу по оператору 2, когда пользователь выделяет этот заказ.
Вызывает SQLExecute , чтобы выполнить позиционированную инструкцию обновления, подготовленную на операторе 3, когда пользователь обновляет строку.
Вызывает 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.