metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-07-02 02:43 pm

Я в шоке.

Обсуждение одновременного выполнения и чтения двух SQL-запросов в одном коннекте и транзакции (или, упаси Б-г, двух транзакций в одном коннекте) свелось к тому, что НИКТО это не использует. Ну, б-г с ним, что нигде кроме Firebird этого нет, но я всегда считал что операция "ленивым образом перебрать 100500 проводок, параллельно так же ленивым образом вычитывая их детализацию" это самоочевидное действие, такое же как два вложенных цикла, с обработкой списка сущностей в внешнем и списка вложенных сущностей во внутреннем.
Нет, оказывается это не так. Мне предложили все виды извращенной любви с БД - загрузку датасета в память и затем выполнение второго запроса, выполнение джоина и свертку его результатов в граф объектов, и прочая и прочая.
А я тут в святом неведении Олега почитываю на тему fold-like обработки БД и пытаюсь обобщить это на случай доступа к БД из ADO.NET и обработки нескольких вложенных таблиц.

Неудивительно, что NoSQL внезапно оказался настолько популярен. Потому что в умах разработчиков и в большинстве RDBMS аналогов действию "получить сущность и ее подчиненные сущности" просто НЕТ.

[identity profile] zamotivator.livejournal.com 2010-07-02 02:53 pm (UTC)(link)
Кастую крокодила ([livejournal.com profile] plumqqz) в тред.

[identity profile] zamotivator.livejournal.com 2010-07-02 03:03 pm (UTC)(link)
Очень многие говорят, что Perl DBI очень хорош.
Пойти что ли perl выучить ради такого дела, чтобы по достоинству оценить и на другие языки спортировать.

[identity profile] sorhed.livejournal.com 2010-07-02 03:04 pm (UTC)(link)
DBI хорош?

Если DBI считается хорошим (нет, он неплох, конечно, just does its job — но и без изысков) — то я представляю, что там такое в дотнете творится.

[identity profile] zamotivator.livejournal.com 2010-07-02 03:07 pm (UTC)(link)
Я краем глаза ADO как-то раз видел.
Съебался в диком ужасе.

Видать именно поэтому я СУБД пилю, а не под БД разрабатываю.
Психика покорёжена.

[identity profile] sorhed.livejournal.com 2010-07-02 03:09 pm (UTC)(link)
Перл, кстати, всё равно надо знать, конечно. Он, сцуко такое, постоянно пригождается.

[identity profile] metaclass.livejournal.com 2010-07-02 03:16 pm (UTC)(link)
Ад там.

[identity profile] metaclass.livejournal.com 2010-07-02 03:16 pm (UTC)(link)
Даже ОН сказал что надо выполнять запросы по очереди. "Я рыдал полчаса".

[identity profile] plumqqz.livejournal.com 2010-07-02 09:34 pm (UTC)(link)
Дык а как же иначе?
Либо мы только читаем, и тогда нам пофигу, сколько у нас там коннектов.
Либо мы в одной транзакции можем писать из нескольких соединений параллельно, и тогда я даже не знаю что: либо надо разводить транзакции блокировками (и опять какая тогда разница, сколько коннекций - получается просто грязное чтение), либо, если один параллельный процесс в этом соединении может писать туда, куда без завершения транзакции написал другой параллельный процесс этого же соединения, то база просто не будет работать. Не умеет.

[identity profile] metaclass.livejournal.com 2010-07-03 06:08 am (UTC)(link)
Не, тут ситуация такая: даже если мы только читаем - если это делать из разных коннектов/разных транзакций - есть вероятность, что разные запросы увидят разные данные. Если между первой и второй транзакцией всунется какая-нибудь с записью.

[identity profile] plumqqz.livejournal.com 2010-07-03 06:30 pm (UTC)(link)
Стоп. Я, кажется, несколько недопонимаю. Хочется не из двух тредов в рамках одной транзакции писать в базу, а отправить один запрос, потом второй, потом взять данных из первого, потом из второго и так далее?

[identity profile] plumqqz.livejournal.com 2010-07-04 07:46 am (UTC)(link)
Это что, в ADO.NET такое невозможно??! Быть не может.

[identity profile] metaclass.livejournal.com 2010-07-04 07:59 am (UTC)(link)
Возможно через пляски с бубном.
MSSQL - нужно добавить параметр MultipleActiveResultSets=true в строку подключения, проблема, похоже в протоколе сервера. Не рекомендуется в некоторых случаях, по умолчанию выключено.
PostgreSQL - нужно добавить параметр PreloadReader=true в строку подключения, что эффективно убивает весь смысл построчного чтения результатов запросов, т.к. оно при первом обращении высасывает все в память, судя по всему.
Firebird - работает по умолчанию, обычный режим что при доступе через клиентскую либу, что при использовании ADO.NET.

Оракла нету под руками попробовать.

[identity profile] plumqqz.livejournal.com 2010-07-04 08:07 am (UTC)(link)
Что же, остается только сочувствовать.