metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-07-02 07:04 am

Как же удолбут.

Тема "сессий" и "транзакций" при подключениях к различным базам данных судя по всему является очередным потаенным вуду для разработчиков. Причем даже для разработчиков самих БД и драйверов доступа к ним.

Иначе я не могу объяснить тот факт, что в некоторых серверах невозможно открыть одновременно две транзакции в одном соединении. Или то, что из трех ADO.NET провайдеров (Firebird, MSSQL, Postgresql) одновременно открыть два SQL запроса в одном соединении и читать одновременно из них - можно только в Firebird, два остальных ругаются типа "уже открыт DataReader".

Ну вот вопрос как в ADO.NET ленивым образом (не загружая в память) прочитать список сущностей из БД, и для каждой сущности прочитать вложенные для нее?
Ну всегда обычное решение было - цикл по одному DataReader, из него берем некое поле, подсовываем его значение в параметр второй команде, выполняем ExecuteReader и пытаемся читать во вложенном цикле. В Firebird работает, в других хрен.

PS: В Npgsql есть параметр PreloadReader=true, который позволяет обойти это ограничение и который не рекомендуется использовать, т.к. он грузит весь DataReader в память и смысл ленивой итерации теряется. И написано, что это ограничение - by design, упомянуто в доке на ADO.NET.

По моему, архитекторов ADO.NET надо убить, это же идиотизм клинический.

[identity profile] metaclass.livejournal.com 2010-07-02 11:36 am (UTC)(link)
Firebird умеет. Судя по всему что здесь пишут, это единственный сервер, который это умеет.

[identity profile] molnij.livejournal.com 2010-07-02 11:58 am (UTC)(link)
т.е. он отдает какой-то идентификатор транзакции, которую потом нужно указывать при выполнении запросов? Если да - то как-то очень уж похоже на функционал сессии, если нет - неясно как потом разруливается доступ к незафиксированным данным

[identity profile] metaclass.livejournal.com 2010-07-02 12:00 pm (UTC)(link)
Да, хендл транзакции отдает апишная функция что-то вроде start_trans.
Сессия это дорогой объект - новый коннект к базе данных тяжел. А транзакция поверх уже существующего коннекта дешевле.