|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Michael Samanov 2:550/5068.1515 26 Aug 2000 10:15:59 To : Juriy Goloveshkin Subject : Re: DBI+здоровые таблицы -------------------------------------------------------------------------------- Hello, Juriy! At Fri, 25 Aug 00 17:38:29 +0400 Juriy Goloveshkin wrote: JG>>> $dbh->do('declare test cursor for select * from addresses'); JG>>> while (my @test=$dbh->selectrow_array('fetch test')){ MS>> А точно надо на каждый цикл курсор создавать? JG> что значит "на каждый цикл"? не понял я. все зависит от логики программы. это JG> был пример работы с курсором. Hа каждый цикл while(...selectrow_array). Все, вопрос снят. В постгрессе курсор объявляется DECLARE и сразу становится доступен для FETCH, т.е. работает в контексте транзакции, а в интербейсе, наоборот, он объявляется DECLARE, становится, таким образом, частью метаданных базы, а открывается по OPEN. MS>> Это не метаданные ли ты так изменяешь? JG> чего делаю? ;) Метаданные - это структура базы, записанная в служебных таблицах. Типа имена таблиц, индексы, триггеры, связи и т.д. MS>> А работает оно внутри одной транзакции или глобально? JG> оно это кто? курсоры работают внутри транзакции(для этого и AutoCommit JG> сбрасывается). Оно - я имел в виду курсоры. Как видишь, выше я привел разницу в реализации курсоров в разных СУБД. MS>> Это я к тому, что не имеется ли тут подводных камней? JG> мне нужно было читать большие таблицы. Я это получил. какие подводные камни? А камни - они завсегда присутствуют :-) JG> могу только сказать, что чтобы не переполнять лог транзакций, пользительно JG> фетчить через одно соединение, а какие-либо другие работы с базами проводить JG> через другое. мне так видится... И неправильно видится. Hе закрывать транзакции - вообще дурной тон. Тем более, что лог транзакций - один на все соединения. Если уж у тебя отключен $dbh->{AutoCommit}, то делать commit или rollback ты обязан хоть укакайся. Рекомендуется это делать через eval таким примерно образом: { local $dbh->{AutoCommit} = 0; local $dbh->{RaiseError} = 0; eval { /* ряд операций, которые должны быть в одной транзакции */ ... } $@ ? $dbh->rollback : $dbh->commit; } Hе делать этого - примерно то же, что на C писать malloc без free. Hе знаю, как DBD::Pg смотрит на local $dbh->{AutoCommit}, а вот новый DBD::InterBase очень даже кушает эту конструкцию, в то время, как старый вариант ругался как-то наподобие "unable to set local $dbh->{AutoCommit}". Так что я теперь делаю AutoCommit=1, чтоб не делать commit на каждый чох, а в отдельных случаях его отключаю и работаю как показано выше. Sincerely yours, Michael (mailto:mike@vlink.ru). --- ifmail v.2.14 * Origin: Home (2:550/5068.1515@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/7949a0bd9a1a.html, оценка из 5, голосов 10
|