我很难让手动事务按照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;
但这似乎与任何文档都不一致。
我只是误解了吗?
我的理解是,如果我想手动管理事务,我应该关闭AutoCommit。
正确的。
但是,DBD::Pg会自动为您启动事务。您不能手动启动事务。最好的选择是关闭自动提交,然后执行:
$dbh->commit;
,当您准备提交时。这将提交现有事务并启动新事务。
现在,如果您将autocommit设置为on,那么任何存在于事务之外的东西都将成为它自己的事务,每个语句一个事务。如果您希望确保手动管理事务,则需要将其设置为关闭。
我的理解是,如果我想手动管理事务,我应该关闭AutoCommit。
不,恰恰相反。将AutoCommit
设置为0
会启动一个事务,因此您希望将其设置为1
。自动提交更改(AutoCommit => 1
)是让数据库不使用事务,这与您想要的相反。