【发布时间】:2020-09-28 16:06:56
【问题描述】:
我为 Perl DBIx::Class 模块的不一致行为而苦恼。我写了一个简单的纯 Perl 类,它定义了类成员 'schema',它只是对预先初始化/连接的 DBIx::Class::Schema 对象的引用和向数据库添加一些数据的方法:
sub new {
my $class = shift;
my $params;
if(1 == scalar @_ && 'HASH' eq ref($_[0])) {
$params = shift;
} else {
my %params = @_;
$params = \%params;
}
my $self = {
schema => $params->{schema}
};
bless $self, $class;
return $self;
}
sub addToQueue {
my $self = shift;
my $params;
if(1 == scalar @_ && 'HASH' eq ref($_[0])) {
$params = shift;
} else {
my %params = @_;
$params = \%params;
}
#some parameter constraints checks
....
$self->{schema}->txn_do(sub {
$self->{schema}->resultset('SOME_QUEUE')->create($params);
});
# this row is necessary if this method is called from programs, which uses moose
$self->{schema}->txn_commit();
return;
}
如果我从一个 Perl(使用 Moose)程序调用 addToQueue 方法,我必须添加代码行
self->{schema}->txn_commit();
真正触发数据库提交命令。如果我从另一个 Perl 程序(不使用 Moose)调用该方法,代码将失败并显示以下消息:
使用未初始化的值 $msg 代替 (s///) at /usr/local/share/perl/5.20.2/DBIx/Class/Exception.pm 第 58 行。 连接 (.) 或字符串中的未初始化值 $msg /usr/local/share/perl/5.20.2/DBIx/Class/Exception.pm 第 68 行。 DBIx::Class::Storage::txn_commit():拒绝提交 开始交易
如果我删除重复的提交命令,它适用于非 Moose 程序,但 Moose 使用程序省略了提交,创建的条目不会写入数据库。
有人知道这些问题吗?
【问题讨论】:
-
Moose 程序是什么意思?请告诉我们架构是如何连接的,并告诉我们您使用的是什么数据库引擎。
-
一个包含 Moose 模块的程序,例如:use Moose;使用命名空间::autoclean;使用 MooseX::AutoImmute;
标签: perl transactions moose dbix-class