繁体   English   中英

Perl DBIx::Class 缺少提交的事务

[英]Perl DBIx::Class transactions with missing commit

我为 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)调用该方法,代码将失败并显示以下消息:

在 /usr/local/share/perl/5.20.2/DBIx/Class/Exception.pm 第 58 行的替换 (s///) 中使用未初始化的值 $msg。在连接 (.) 中使用未初始化的值 $msg 或/usr/local/share/perl/5.20.2/DBIx/Class/Exception.pm 第 68 行的字符串。 DBIx::Class::Storage::txn_commit():拒绝在没有启动事务的情况下提交

如果我删除重复的提交命令,它适用于非 Moose 程序,但使用 Moose 的程序会忽略提交,并且创建的条目不会写入数据库。

有人知道这些问题吗?

txn_do文档中

警告:如果您使用AutoCommit => 0连接,则事务被认为是嵌套的,您仍然需要在适当的时候调用“txn_commit”来写入您的更改。 如果您的数据库的存储驱动程序支持它,您还需要连接auto_savepoint => 1以使部分回滚工作。

建议使用AutoCommit => 1连接。

当您需要额外的txn_commit时,我怀疑您正在使用AutoCommit => 0

简短的回答是:您提交了两次交易。 当没有异常抛出时, txn_do在离开块时自动提交。 请发布一个从 DBIC_TRACE=1 加载 Moose 和日志的代码示例,这表明没有触发提交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM