簡體   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