Люди, помогите пожалуйста. Из перлового скрипта не проходит транзакция с 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;
Привет,>А в скрипте когда доходит до команды $sth->execute выдаёт ошибку :
>"Issuing rollback() for database handle being DESTROY'd without explicit disconnect()".Да, потому что ваш скрип заканцивает работу, не выставив команду
dbh->disconnect().Стиль программирования есть стиль программирования... А чтоб получить свои данные, неплохо бы выполнить, скажем, fetchrow_hashref() или что-то подобное на ваш вкус...
WWell,
Огромное спасибо, скрипт заработал! Всё из-за невнимательности, ещё раз спасибо.
Однако делаю тоже самое в 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
Где примерно может быть ошибка? Заранее благодарю.
Привет,Я бы посмотрел внимательнее что изменилось с 7.03 до вашей 8-ки Postgres... Если память не изменяет, 7.03 - релиз трех-четырехлетней давности (судя по DBI 1.29 тоже). Возможно, изменилось что-нибудь в выполнении транзакции со стороны самого энджина Postgres.
Возможно так же, что у вас возникает ошибка при выполнеий одного из запросов транзакции; при этом энджин "сваливает" всю транзакцию. Вот здесь есть объяснение как в 8-ке это обойти:
http://www.sql.ru/forum/actualthread.aspx?tid=180204
WWell,
Благодарю Вас!
Если бы не Вы меня бы начальники придушили бы.
Разобрался. Пришлось немного код менять. Перед каждым execute выставил $dbh->commit; после чего всё заработало.
Привет,>Разобрался. Пришлось немного код менять. Перед каждым execute выставил $dbh->commit; после чего всё заработало.
У вас стоит:
$dbh = DBI->connect("DBI:Pg:dbname=test", "user", '',
{AutoCommit => 0, PrintError => 0, RaiseError => 0});Во многих случаях удобнее прописать прямо здесь "AutoCommit => 1". Почитайте в man DBI об этом.
WWell,