[perl] $dbh->begin_work shlaegt fehl

Hi.

Wenn ich mich per DBI:: Pg zur Datenbank verbinde und anschliessend eine Transaktion starten will, bekomme ich immer den Fehler

DBD::Pg::db begin_work failed: Already in a transaction at parser.pl line 16.

obwohl ich noch keine Transaktion gestartet habe. Ein voheriges $dbh->commit behebt das Problem auch nicht :frowning:
Hat jemand aehnliche Erfahrungen gemacht und ggf. ne Loesung? Ach ja, wo sehe ich denn die aktuellen Transaktionen?

LG.

Du solltest Autocommit beim Connecten deaktivieren, aus der DBI Manpage:

$dbh = DBI->connect($dsn, $user, $password,
{ RaiseError => 1, AutoCommit => 0 });

Explicitly defining the required “AutoCommit” behaviour is strongly recommended and may become mandatory in a later version. This determines whether changes are automatically committed to the database when executed, or need to be explicitly committed later.

Dann klappt es auch mit eigenen Commits :slight_smile:

Hi.
So wie du es beschreibst, mache ich es: AutoCommit wird schon beim connect auf Off gestellt. Genau das wundert mich daran ja. Es scheint, als ob mit AutoCommit = 0 vor jedwedes Kommando ein ,BEGIN’’ gesetzt wird - und so eben auch vor ein $dbh->begin_work. Versuch doch mal bitte folgendes:

#!/usr/bin/perl

use strict;
use warnings;
use DBI;
my $dbh = DBI->connect("DBI:Pg:dbname=name;host=host;port=port",
"user", "passwd", {AutoCommit => 0, RaiseError => 1});

print "AutoCommit: ", $dbh->{AutoCommit}?"Ein":"Aus", "\n";
$dbh->commit;
$dbh->begin_work;
$dbh->disconnect;

DBD beschwert sich hier nicht ueber das commit (welches ja ohne ein BEGIN zu einem Fehler fuehren sollte) sondern ueber das begin_work. Somit waere meine These bestaetigt.
Derzeit habe ich AutoCommit explizit auf On, um mit einem begin_work es auf Off zu stellen und die Transaktion zu beginnen.

LG.

Kannst du mal das Query Logging in der DB aktivieren und schauen, welche Befehle vom DB Treiber in Perl nun wirklich abgesetzt werden?
Am besten auch einige sleep()s an den passenden Stellen einbauen, also nach dem Connect, vor dem begin_work ect, damit man sehen kann, was zu welchem Befehl gehört.