0

以下のロジックを書きたいと思います。ループ全体が成功した場合 (つまり、ループのオブジェクトである配列のすべての要素が変換された場合)、データベース操作 (コミット) が続きます。

私は次のように書いた:

    if ($room->save ){ # this line i cant modify
    for ( @{ $room->members } ) {
     if ( $_->save ){      
       $room->ds->commit;                                                                                                                           
     } else {              
     return $c->render_ng_json("fail");
      }                     
   }

私の問題は、私のコードでは、 $_->save が成功するたびにデータベース操作が適用され、コストがかかりすぎることです。12 個のメンバーがあり、それぞれが正常に保存された場合、12 回コミットが試行されます。ループ全体にエラーがないかどうか (つまり、すべてのメンバーが保存されたかどうか) を perl に分析してもらい、その場合にのみコミットします。このロジックをどのように記述しますか?

4

3 に答える 3

2

どうですか:

if ($room->save ){ # this line i cant modify
    for ( @{ $room->members } ) {
        return $c->render_ng_json("fail") unless $_->save ;
    }
    $room->ds->commit;                                                                                                                           
}

部分的なコミットをしたい場合:

if ($room->save ){ # this line i cant modify
    my $failed = 0;
    for ( @{ $room->members } ) {
        $failed = 1 unless $_->save ;
    }
    $room->ds->commit;                                                                                                                           
    return $c->render_ng_json("fail") if $failed ;
}
于 2013-09-09T07:19:14.173 に答える
1

失敗するまで (それが本当に必要な場合は、下のコメント行を削除してください)、またはすべての保存が完了するまで、コミットをそのままにしておきます。

if ( $room->save ) {
    for ( @{ $room->members } ) {
    if ( ! $_->save ) {
        $room->ds->commit;                 # possibly remove.
        return $c->render_ng_json("fail");
    }
    $room->ds->commit;
}
于 2013-09-09T07:20:02.617 に答える