【问题标题】:Perl DBIx::Class transactions with missing commitPerl DBIx::Class 缺少提交的事务
【发布时间】: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


【解决方案1】:

来自documentation for txn_do

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

建议使用AutoCommit => 1 连接。

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

【讨论】:

  • 你是对的。问题是遗留代码使用纯 SQL 命令操纵自动提交状态,因此 dbh->{AutoCommit} 值变得不一致。
【解决方案2】:

简短的回答是:您提交了两次交易。 txn_do 在没有抛出异常的情况下离开块时自动提交。 请发布一个代码示例,加载 Moose 和来自 DBIC_TRACE=1 的日志,显示未触发任何提交。

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2011-01-07
    • 2011-07-09
    • 1970-01-01
    • 2016-10-03
    相关资源
    最近更新 更多