北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

Class::DBIとキャッシュの問題

Class::DBImod_perl下で動かしたとき、updateが他のプロセスに通知されない不具合が発生。ググったら$Weaken_Is_Availableに関する問題ってのがあったのでそれかと思ったら、どうも違う。

Ima::DBIもキャッシュしてるらしい*1し、mod_perl下だと自分でキャッシュ(ゴミ)をこしらえてしまっている可能性も考えられる。そんなこんなで3時間くらい悩む。

で、最終的に原因判明。mysqlのコネクションでAutoCommitを無効にしていたため、select文を発行するだけのコネクションでもトランザクションが有効になっていて他のコネクションの反映を拾ってこなかった模様。理由はあまりにも単純でしたorz。

対応としては、AutoCommitを有効にして、updateを発行する部分では局所的に、

{
local $dbh->{AutoCommit};
#== 処理 ==
...
$dbh->commit();
}

と言う感じ。mod_perlは本当に開発者泣かせだと思う。。。

*1:このキャッシュは、DBIのprepare_cachedメソッドを使うってだけですね。