URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4304
[ Назад ]

Исходное сообщение
"Не работает Perl`овый модуль DBD::Pg"

Отправлено Dima , 26-Май-05 17:24 
Люди, помогите пожалуйста. Из перлового скрипта не проходит транзакция с PostgreSQL 8.01  (система  Slackware 10.1), mod_perl 1.29,  DBI 1.48,  DBD-Pg 1.42. При установке все пакеты встали нормально.
А в скрипте когда доходит до команды $sth->execute выдаёт ошибку :
"Issuing rollback() for database handle being DESTROY'd without explicit disconnect()".
Скрипт:
use DBI;
my $dbh;
$dbh = DBI->connect("DBI:Pg:dbname=test", "user", '',
            {AutoCommit => 0, PrintError => 0, RaiseError => 0});
unless($dbh) {
my          $m->out("Can not connect to database! <p>\n");
            $m->abort(888);
                        }

my $sth_get_states = $dbh->prepare("select pole1, pole2, pole3 from table");
$sth_get_states->execute || die $dbh->errstr;


Содержание

Сообщения в этом обсуждении
"Не работает Perl`овый модуль DBD::Pg"
Отправлено Асен Тотин , 27-Май-05 01:59 
Привет,

>А в скрипте когда доходит до команды $sth->execute выдаёт ошибку :
>"Issuing rollback() for database handle being DESTROY'd without explicit disconnect()".

Да, потому что ваш скрип заканцивает работу, не выставив команду
dbh->disconnect().

Стиль программирования есть стиль программирования... А чтоб получить свои данные, неплохо бы выполнить, скажем, fetchrow_hashref() или что-то подобное на ваш вкус...

WWell,



"Не работает Perl`овый модуль DBD::Pg"
Отправлено Dima , 27-Май-05 08:49 
Огромное спасибо, скрипт заработал! Всё из-за невнимательности, ещё раз спасибо.
Однако делаю тоже самое в HTML с использованием HTML::Mason
скрипт не хочет производить транзакцию. Ругается на 152 строку вот так:
error: ERROR: current transaction is aborted, commands ignored until end of transaction block
context:      
...      
148:      from ManTypes');
150:      my ($mt_id, $mt_title, $mt_icon);

152:      $sth_get_mtypes->execute || die $dbh->errstr;

153:      $sth_get_mtypes->bind_columns(undef,
154:      \$mt_id, \$mt_title, \$mt_icon) || die $dbh->errstr;
155:      while($sth_get_mtypes->fetch) {
156:      $man_types{$mt_id} = $mt_title;
...      
code stack:      /home/web/newmonitor/htdocs/mason/prjmgr/manmgr:152
/home/web/newmonitor/htdocs/mason/prjmgr/autohandler:3

Самое интересное, что этот скрипт работал на другой машине со старыми версиями HTML::Mason1.11, DBI1.29, DBD::Pg1.13 и Postgres 7.03
Где примерно может быть ошибка? Заранее благодарю.


"Не работает Perl`овый модуль DBD::Pg"
Отправлено Асен Тотин , 27-Май-05 13:31 
Привет,

Я бы посмотрел внимательнее что изменилось с 7.03 до вашей 8-ки Postgres... Если память не изменяет, 7.03 - релиз трех-четырехлетней давности (судя по DBI 1.29 тоже). Возможно, изменилось что-нибудь в выполнении транзакции со стороны самого энджина Postgres.

Возможно так же, что у вас возникает ошибка при выполнеий одного из запросов транзакции; при этом энджин "сваливает" всю транзакцию. Вот здесь есть объяснение как в 8-ке это обойти:

http://www.sql.ru/forum/actualthread.aspx?tid=180204

WWell,


"Не работает Perl`овый модуль DBD::Pg"
Отправлено Dima , 27-Май-05 15:33 
Благодарю Вас!
Если бы не Вы меня бы начальники придушили бы.
Разобрался. Пришлось немного код менять. Перед каждым execute  выставил $dbh->commit; после чего всё заработало.  


"Не работает Perl`овый модуль DBD::Pg"
Отправлено Асен Тотин , 27-Май-05 15:45 
Привет,

>Разобрался. Пришлось немного код менять. Перед каждым execute  выставил $dbh->commit; после чего всё заработало.  

У вас стоит:

$dbh = DBI->connect("DBI:Pg:dbname=test", "user", '',
            {AutoCommit => 0, PrintError => 0, RaiseError => 0});

Во многих случаях удобнее прописать прямо здесь "AutoCommit => 1". Почитайте в man DBI об этом.

WWell,