Ответ
Олег 16.04.2003 18:44
Явное управление транзакциями может понадобиться в следующей простой ситуации: допустим, хранимая процедура БД выполняет некие сложные операции и в процессе обнаруживается невозможность завершения этих операций. Процедура может:
1. Выкинуть исключение. При этом транзакция будет откачена штатным образом, но возникают проблемы с обработкой сообщения об ошибке: структурированные исключение не поддерживают ни Interbase, ни парсер.
2. Прервать работу и вернуть параметры ошибки в выборке. Тогда парсерный код может подробно обработать ошибку и при необходимости откатить транзакцию самостоятельно.
Что касается раздельных транзакций на чтение и запись, то тут я погорячился, без дополнительной поддержки в самом парсере такое реализовать невозможно. Речь идет о следующем: при коннекте (то есть только при реальном установлении соединения, а не при каждом вызове connect) заводится одна долгоиграющая read-only транзакция, которая используется для селективных запросов. Эта транзакция не комитится никогда (разве только при реальном разрыве соединения, да и то необязательно). Для остальных запросов создаются отдельные транзакции, живущие в контексте блока connect{} - то есть такие, как все транзакции сейчас.
Такая система позволит сэкономить на запуске и завершении транзакций (с учетом того, что read-only запросов абсолютное большинство). Если при этом повторно использовать препарированные (prepared) запросы, то обмен с СУБД можно уменьшить в несколько раз.