8

DBD::Pg に記載されているように手動トランザクションを機能させるのに苦労しているか、単にドキュメントを誤解しています。

私の理解では、トランザクションを手動で管理したい場合は、AutoCommit をオフにする必要があります。

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

しかし、これを行うと、継続的なエラーが発生します

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

これを機能させるには、最初に AutoCommit をオンにする必要があります。

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

しかし、それはどのドキュメントとも一致していないようです。

私は単にそれを誤解していますか?

4

2 に答える 2

4

私の理解では、トランザクションを手動で管理したい場合は、AutoCommit をオフにする必要があります。

正しい。

ただし、DBD::Pg は自動的にトランザクションを開始します。トランザクションを手動で開始することはできません。最良のオプションは、自動コミットをオフのままにしてから、次のことを行うことです。

 $dbh->commit;

コミットする準備ができたら。これにより、既存のトランザクションがコミットされ、新しいトランザクションが開始されます。

autocommit を on に設定すると、トランザクションの外部に存在するものはすべて独自のトランザクションになり、ステートメントごとに 1 つのトランザクションになります。 トランザクションを手動で管理することを確実にしたい場合は、それをオフにする必要があります。

于 2013-09-19T00:35:44.587 に答える