飴屋

開発日記

2018/3/22

perlのお話。トランザクションのあるデータベース(MyDQLのInnoDB)のハンドラを持っているDBという名前のクラスを作りました。そしてexitが呼ばれて処理が終了し、DBクラスのインスタンスが破棄されるタイミングでデータベース操作をcommitしようとしていました。破棄されるタイミングなので、

sub DESTROY {
# DESTROYの最初の引数には破棄されるインスタンスが渡されるらしい
$_[0]->{dbhandle}->commit();
}

↑こんな感じでいけるのかなと書いたのですが、いざ動かすとデータベースには変更が反映されませんでした。どうもDESTROYが呼ばれる時点でハンドラは既に消えてしまっている模様。
DBIクラス側できっと先に消し込んでいるのでしょう。データベースに接続(connect)する際に何かよいパラメーターを渡すと消されないのかなと思いつつ、都合のよさそうなパラメーターを見つけることができなかったので、

END {
$_->{dbhandle}->commit() foreach (@instanceCollection);
}

DBクラスのインスタンスのコレクションを持っていたので、exitの直前に呼ばれるENDの中で一つずつcommitするように書いたらうまくいきました。これまで意識する必要がなかったけど、ENDが先に呼ばれるんだぁって順番を覚えました。

Last-Modified