fc2ブログ

無精で短気で傲慢なプログラマ

UNIX や web やプログラムの技術的なことを中心に。

perl+DBI プログラムの鉄則 - RaiseError と AutoCommit

perl+DBI プログラムの鉄則 のつつき。

鉄則その 1.

    my $dbh = DBI->connect($dsn, $user, $password,
         {RaiseError => 1, PrintError => 0, AutoCommit => 0 });

connect 時にするべきこと。

RaiseError は ON にする。そうすれば DB の処理でエラーが発生した
ときに勝手に die してくれる。いちいちエラーチェックをする
必要もなくなるし、エラーチェック漏れも起こりえない。楽できるのに、
なおかつ質も向上する。プログラマたるもの、怠惰でなくてはならない。

デフォルトでは PrintError が ON で RaiseError を OFF になっている。
RaiseError を ON にするとエラー発生時にエラーメッセージがダブって
表示されてしまうため、PrintError は OFF にする。


AutoCommit は OFF にする。コミットは、すべての処理が成功した場合に
最後に一度だけ行うもの (基本的には)。DBI のデフォルトは AutoCommit が
ON なので、INSERT・UPDATE するたびに毎回コミットしてしまう。必ず
OFF にすること。

MySQL の MyISAM と InnoDB

MySQL で、トランザクションの機能がない MyISAM 型を使っていた場合は
AutoCommit を OFF にしても意味がない。トランザクション機能を持つ
InnoDB を使うこと。どうしてもパフォーマンスが必要な場合のみ
MyISAM の使用を検討すればよい。


MySQL は MyISAM がデフォルトなためか、MySQL で育った人は、トラン
ザクションを知らない、または軽視している人が多そうな気がする (わたしは
Oracle で育って PostgreSQL にちょっと手を出した人間なので、信じられない)。

調べてみると、初期の MySQL は速度重視・トランザクションなんて不要、
という立場だったらしく、現在の MySQL のドキュメントもかなり速度を
重視したスタンスとなっている。その分、トランザクションがなくても
実装でなんとかなる、的なことが書いてある。

しかしエンタープライズ用途ではトランザクションがないと話にならないので、
MySQL も InnoDB を開発し、選択肢を増やしたわけである。

MyISAM と InnoDB の利点と欠点を知った上で比較検討し、その結果 MyISAM を
使うなら何も言わないが、InnoDB のことを知らない人はすぐに勉強すること。
まずは InnoDB を使って、パフォーマンスが悪いときに MyISAM の使用を
検討するべきである。
スポンサーサイト



PageTop

コメント


管理者にだけ表示を許可する