我一整天都在为这个问题而挣扎。。在我松开所有头发之前,我想我会问这里。
说明
我将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;
};
}
回滚情况:失败(更改写入数据库)
提交案例:工作(更改写入数据库)
如果您能提供任何帮助或建议,我们将不胜感激。
提前谢谢。
您可能正在打开多个数据库连接。如果您提交的连接与具有事务的连接不同,则行为正是您所期望的。
我建议你重新检查你的程序流程,以确保你只有一个单一的连接。