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


Фиксация и откат транзакций

Для фиксации или отката транзакции в режиме ручной фиксации приложение вызывает SQLEndTran. Драйверы для СУБД, поддерживающие транзакции, обычно реализуют эту функцию, выполнив инструкцию COMMIT или ROLLBACK . Диспетчер драйверов не вызывает SQLEndTran , если подключение находится в режиме автоматической фиксации; оно просто возвращает SQL_SUCCESS, даже если приложение пытается откатить транзакцию. Так как драйверы для СУБД, которые не поддерживают транзакции, всегда находятся в режиме автоматической фиксации, они могут либо реализовать SQLEndTran для возврата SQL_SUCCESS без каких-либо действий, либо не реализовать его вообще.

Примечание.

Приложения не должны фиксировать или откатывать транзакции путем выполнения инструкций COMMIT или ROLLBACK с помощью SQLExecute или SQLExecDirect. Последствия этого не определены. Возможные проблемы включают в себя драйвер, который больше не знает, когда транзакция активна, и эти инструкции завершаются ошибкой в источниках данных, которые не поддерживают транзакции. Вместо этого эти приложения должны вызывать SQLEndTran .

Если приложение передает дескриптор среды в SQLEndTran, но не передает дескриптор подключения, диспетчер драйверов концептуально вызывает SQLEndTran с дескриптором среды для каждого драйвера, имеющего одно или несколько активных подключений в среде. Затем драйвер фиксирует транзакции в каждом соединении в среде. Однако важно понимать, что ни драйвер, ни диспетчер драйверов не выполняют двухэтапную фиксацию подключений в среде; Это просто удобство программирования для одновременного вызова SQLEndTran для всех подключений в среде.

(Двухэтапная фиксация обычно используется для фиксации транзакций, которые распределяются по нескольким источникам данных. На первом этапе источники данных опрашиваются о том, могут ли они зафиксировать свою часть транзакции. На втором этапе транзакция фактически фиксируется во всех источниках данных. Если какие-либо источники данных отвечают на первый этап, что они не могут зафиксировать транзакцию, второй этап не происходит.)