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。

不,恰恰相反。设置AutoCommit0启动事务,因此您希望将其设置为1. 让您的更改自动提交 ( AutoCommit => 1) 是让数据库不使用事务,这与您想要的相反。

于 2013-06-13T04:20:06.460 回答
4

我的理解是,如果我想手动管理事务,我应该关闭 AutoCommit。

正确的。

但是,DBD::Pg 会自动为您启动事务。您不能手动启动事务。您最好的选择是关闭自动提交,然后执行以下操作:

 $dbh->commit;

当你准备好提交时。这将提交现有事务并启动新事务。

现在,如果您将 autocommit 设置为 on,那么任何存在于事务之外的事物都会成为它自己的事务,每个语句一个事务。 如果您想确保手动管理事务,您希望将其设置为关闭。

于 2013-09-19T00:35:44.587 回答