« 見頃を過ぎた紅葉狩り | ホーム | Playlist: Vocaloids 2012.12 »

2013年1月16日

not an error

SQLite に DBIx::Skinny を使っていて、こんなエラーに遭遇した:

DBD::SQLite::st fetchrow_hashref failed: not an error
abort due to ROLLBACK at ...DBIx/Skinny/Iterator.pm line 30.

"not an error" ってなんだよ? というのが最初の感想。

擬似的なコードで表すと、このような使い方をしている箇所だった:

my $itr = $model->search('table', $cond);
while( my $item = $itr->next ){
    ...
    ...
}

while の中ではいろいろ処理をしていて、リストアイテム $item ひとつあたりにつき(1ループにつき)、幾百レコードの規模の、ほかのテーブルのレコードの更新の繰り返しをしているのだった。 $item リスト自体は小さくて、 10 個程度。 while が 10 回まわる程度。

なんてことは無いように見えるけれど、数個目の $item に関係する、 while 内部で行われる沢山のレコードの更新の途中で、冒頭のエラーが出て止まってしまった。のだった。

整合性が悪いとかの問題ではなさそう。と言う根拠には、アイテムリストのオーダーを変えれば、問題が出た時の $item では現象が出なかったから。 while 内部で行っている処理の累積件数がある上限に来たらこのエラーになるようにも思われた。

そこで、物は試しで、イテレータを介さずに、 search の結果を配列に入れてループをまわすようにしたらば、同じエラーは出る事が無くなった。

my @items = $model->search('table', $cond);
while( my $item = shift @items ){
    ...
    ...
}

ステートメント・ハンドラが Skinny の内部でこんがらがっちゃってるんじゃないかしらと、雲をつかむような想像をしているだけで、原因の追及はしていない。

コメントする

OpenID対応しています OpenIDについて

このブログ記事について

このページは、hiroakiが2013年1月16日 23:33に書いたブログ記事です。

ひとつ前のブログ記事は「見頃を過ぎた紅葉狩り」です。

次のブログ記事は「Playlist: Vocaloids 2012.12」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。