DBD :: Pg中的手动事务管理

时间:2013-06-13 03:51:36

标签: perl postgresql dbi dbd-pg

我很难按照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;

但这似乎与任何文件都不一致。

我只是误解了吗?

2 个答案:

答案 0 :(得分:2)

  

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

正确。

但是,DBD :: Pg会自动为您启动交易。您无法手动启动交易。您最好的选择是关闭自动提交,然后执行:

 $dbh->commit;

当你准备提交时。这将提交现有事务并开始新事务。

现在,如果您将autocommit设置为on,那么事务外部存在的任何内容都将成为自己的事务,每个语句一个事务。如果您希望确保手动管理事务,则需要将其关闭。

答案 1 :(得分:1)

  

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

不,恰恰相反。将AutoCommit设置为0会启动一个事务,因此您需要将其设置为1。要自动提交更改,就是让数据库不使用事务,这正是您想要的。