Perl and Rose::DB Postgres Transactions



我一整天都在为这个问题而挣扎。。在我松开所有头发之前,我想我会问这里。

说明

我将Perl 5.10.1与Rose::DB和PostgreSQL 8.4(在Debian Linux上)一起使用。

我需要对我的"trans"对象进行一些更改,使其位于单个事务块内(即,这些更改要么全部写入,要么回滚)。然而,我就是无法让它发挥作用。

我已经尝试过自动提交打开和关闭。

在下面的示例代码中,$db是在脚本开始时建立的Rose::db连接(使用:my$db=my::db->new;)。所有Rose::DB对象都继承自基类(My::base)。这个基类有一个可继承的DB连接子类:

sub init_db
{
    My::DB->new_or_cached
}

DB连接对象(My::DB)包含连接字符串和设置:

_ _PACKAGE_ _->use_private_registry;
_ _PACKAGE_ _->register_db(
    driver          => 'pg',
database        => 'xx',
host            => 'localhost',
username        => 'xx',
password        => 'xx',
    connect_options => {
        AutoCommit      => 0,  -- changed to suit SCENARIO 1 and 2 below
        RaiseError      => 1,
    }
);

场景1:自动提交关闭

自动提交0并引发错误1

my $trans = shift;
eval {
    $trans->...        -- Make changes to object
    $trans->save;
    # die "testing";   -- Cause a rollback using "die"
    $db->commit or die $db->error;
};
if ($@)
{
    warn "aborted: $@";
    eval {
        $db->rollback;
    };
}

回滚情况:有效(没有写入数据库的更改)

提交情况:失败(未将更改写入数据库)

场景2:自动提交

AutoCommit 1和RaiseError 1

my $trans = shift;
eval {
    $db->begin_work or die $db->error;
    $trans->...        -- Make changes to object
    $trans->save;
    # die "testing";   -- Cause a rollback using "die"
    $db->commit or die $db->error;
};
if ($@)
{
    warn "aborted: $@";
    eval {
        $db->rollback;
    };
}

回滚情况:失败(更改写入数据库)

提交案例:工作(更改写入数据库)

如果您能提供任何帮助或建议,我们将不胜感激。

提前谢谢。

您可能正在打开多个数据库连接。如果您提交的连接与具有事务的连接不同,则行为正是您所期望的。

我建议你重新检查你的程序流程,以确保你只有一个单一的连接。

相关内容

  • 没有找到相关文章

最新更新