ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

トランザクション処理ができなきゃ、DBを仕事でつかえないですよねえ。。でPHPの場合

2005-11-05 17:43:34 | JavaとWeb

 データベースを仕事で使う場合、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上、エラーにならなかった(主キーにしていない場合にありえる)
   もしくは、エラー処理もしてなかった

 なーんてことも、トランザクション処理について書いてない本をみて、作ったら、ありえちゃうよーな気が。。。。しないかなあ??

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 母親毒殺未遂事件にみる、検... | トップ | CGI,PHPを使ったペー... »
最新の画像もっと見る

JavaとWeb」カテゴリの最新記事