gpt4 book ai didi

Perl 和 Rose::DB Postgres 事务

转载 作者:行者123 更新时间:2023-11-29 13:05:18 25 4
gpt4 key购买 nike

我一整天都在为这个问题苦苦挣扎..想在我脱掉所有头发之前在这里问一下。

描述

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

我需要在单个事务 block 中对我的“trans”对象进行一些更改(即更改全部写入或回滚)。但是,我就是无法让它工作。

我已经尝试过打开和关闭 AutoCommit。

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

sub init_db
{
My::DB->new_or_cached
}

数据库连接对象 (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 和 RaiseError 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:自动提交开启

自动提交 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;
};
}

回滚案例:​​失败(写入数据库的更改)

提交案例:有效(写入数据库的更改)

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

提前致谢。

最佳答案

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

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

关于Perl 和 Rose::DB Postgres 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14868333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com