2013-06-13 6 views
5

Ich habe es schwer, manuelle Transaktionen zu arbeiten, wie in DBD :: Pg dokumentiert, oder ich verstehe einfach die Dokumentation nicht.Manuelle Transaktionsverwaltung in DBD :: Pg

Mein Verständnis ist, dass wenn ich Transaktionen manuell verwalten möchte, sollte ich AutoCommit deaktivieren.

$dbh->{AutoCommit} = 0; 
$dbh->begin_work; 

Aber wenn ich das tue, ich kontinuierliche Fehler

DBD::Pg::db begin_work failed: Already in a transaction 

Um dies zu erhalten, zu arbeiten, muss ich zuerst auf AutoCommit einzuschalten.

$dbh->{AutoCommit} = 1; 
$dbh->begin_work; 

Aber das scheint mit keiner der Dokumentation übereinzustimmen.

Bin ich es einfach missverstanden?

+0

Das scheint alles ziemlich seltsam. Können Sie einen vollständigen Testfall zeigen und Ihre DBI- und DBD :: Pg-Versionen angeben? –

Antwort

1

Mein Verständnis ist, dass wenn ich Transaktionen manuell verwalten möchte, sollte ich AutoCommit deaktivieren.

Nein, ganz im Gegenteil. Wenn Sie AutoCommit auf 0 setzen, wird eine Transaktion gestartet. Daher müssen Sie sie auf 1 setzen. Damit Ihre Änderungen automatisch übernommen werden, verwenden Sie die Datenbank nicht für Transaktionen, was genau Ihren Vorstellungen entspricht.

+0

Scheint eher unintuitiv. Aktivieren Sie Autocommit, damit ich eine manuelle Transaktion starten kann. –

+0

Natürlich ist es, weil du etwas Dummes tust. – ikegami

+2

Um fair zu sein, macht es nur Sinn, wenn Sie erkennen, dass Autocommit = 0 einen BEGIN für Sie sendet –

2

Mein Verständnis ist, dass wenn ich Transaktionen manuell verwalten möchte, sollte ich AutoCommit deaktivieren.

Korrekt.

DBD :: Pg startet jedoch automatisch Ihre Transaktionen für Sie. Sie können die Transaktionen nicht manuell starten. Ihre beste Option ist Autocommit auslassen und dann tun Sie einfach:

wenn Sie bereit sind zu begehen. Dies wird die bestehende Transaktion bestätigen und eine neue Transaktion starten.

Wenn Sie nun autocommit auf on setzen, wird alles, was außerhalb einer Transaktion existiert, zu einer eigenen Transaktion, eine Transaktion pro -Anweisung. Wenn Sie sicherstellen möchten, dass Transaktionen manuell verwaltet werden, möchten Sie sie deaktivieren.