データベースを仕事で使う場合、DBを個人だけのものとして、検索ファイル代わりに使うケースと(Accessなどで、このケースがある)、みんなで共用して使うケースがある。本来のDBの目的としては、後者であり、Webで使う場合、原則、後者と考えられる。
さて、DBを共有して使う場合には、トランザクション処理が重要である。複数のDBを更新しする場合、そのデータの一貫性をたもつため、一度に更新し、もし、途中でおかしくなったら、そのとき更新しようとしていたものを、全部の(更新しようとしていた)DBに対してキャンセルがかけられなければならない。
もちろん、その他に排他制御、そして、参照と更新時の一貫性を保つため、タイムスタンプや更新カウンタなどによる、更新しようとしているデータに関して、他者が更新していないかどうかの確認方法も重要である。
したがって、WebからDBアクセスをする仕事の場合、トランザクション処理は必要不可欠であり、この方法がない、あるいは分からないようでは、それは仕事に使えない。
。。この意見に、賛成な人だけ、以降みてください。
反対意見の人は、以下、そのような人たちからみると、不快な文章が含まれていると思われるため、そういう人は見ないでください。反対意見をコメントしていただく必要はありません。
そこでなんですけど、ここ2、3日、わけあって、PHPの調査してます。
で、気付いたんですけど。。。
PHPの本で、トランザクション処理について、書いてある本が少ないんですよ。
書いてある本としては、たしか、10日でおぼえるPHP5入門教室がSQLLiteを使って、ちゃんと書いています。
なんで、この本はいいです。
でも、問題はこれ以外の他の本です。
SQLLiteでも、mySQLでも、トランザクションについて、ぜーんぜんかいてない気がするんです。
mySQLの場合、InnoDBの説明もないです。
mysqliの説明はある本もありますけど、トランザクションの部分はかいてなくて、プレースメントホルダーについてです。
うーん。。。
mySQLの場合、トランザクション処理させるには、InnoDBにして、mysqliでアクセスしてとか、いろいろあると思うんですよ。。なんで、その部分が書いてないと、仕事になんないと思うんですけどねえ。。(この文は、上記の「トランザクション処理がわかんないと仕事にならない」と思う人だけ読んでもらってることを前提に書いています)
逆に、もっと怖いのは、トランザクションについて書いてなくても、DBについては書いてあるので、そういう本を読むと、ひととおりPHPができる気分になるわけです。
で、仕事をとってくる
トランザクション処理しない。
もちろん、更新カウンタやタイムスタンプによる、データ変更の矛盾処理もしない。
で、みんないっせいにアクセス!とか。。
そうすると、どうなるか。。
。。。やばいとおもうんですよ。
まあ、そんなやついねーよ!といえば、そうかもしんないですけどね。。。
でも、ですよ、ひょっとしてありえない話じゃないですよね。
最近、「同時に行われたとき、ほかの人のデータが見えてしまう」という障害が良くニュースになる気がします。
このミスは、一般的には、Javaにおいて、メソッド内でなく、クラスのところでstatic変数で取ってしまったとき、おこるミスと思われています。
でも、もっと、基本的なミス、
・トランザクション処理とか排他を意識しないで、
・DBからIDの最大値を取ってきて、1足した値を自分のIDとして登録し、
・そのID更新が同時に2箇所から行われたにもかかわらず、
DB上、エラーにならなかった(主キーにしていない場合にありえる)
もしくは、エラー処理もしてなかった
なーんてことも、トランザクション処理について書いてない本をみて、作ったら、ありえちゃうよーな気が。。。。しないかなあ??