今まで、主に PostgreSQL を使用してトランザクションを用いた開発をしておりましたが、MySQLに乗り換えるにあたり、MyISAM ではトランザクションが使えませんので、例えば1スクリプトで複数テーブルを更新するような際、データベースの一貫性をどうしても保てなくなってしまうと思います。
実際に運用されている方々は、この問題に対しどうしているのでしょうか。やはり適所で InnoDB を使いなさい、というのが正解でしょうか。
http://tech.blog.klab.org/archives/50160510.html
テーブルの一貫性ということであれば、
規模にもよりますが自分はMyISAMでテーブルロックを使っています。
しかし、現状のトランザクション処理をそのまま使用したいのなら、
やはりinnoDBを使うしかないと思います。
すいません、余りにも言葉足らずでした。
テーブルロックはアクセスの衝突を防ぐためです、トランザクションは関係ありません。
変な回答して申し訳ありませんでした。
まだInnoDBの実装がなかった頃、MyISAMテーブルで開発を行ったことがあります。
その時は、自前で障害発生時のロールバック処理を可能な限り入れましたが、破綻しましたね。
ロールバック処理で障害を起こしたら、もうどうしようもなくなりますので。
1テーブルでもそうですので、複数テーブルでやってたら、話にならなかったと思います。
なので、InnoDBを使うのが唯一の解じゃないでしょうか。
http://dev.mysql.com/doc/refman/4.1/ja/innodb-transaction-model....
ありがとうございます。
やはり
http://dev.mysql.com/doc/refman/4.1/ja/ansi-diff-transaction...
>MySQL サーバでは、ほとんどの場合、更新前に簡単なチェックを組み込んだり、データベースの不整合をチェックして、不整合が発生した場合には自動的に修復または警告する簡単なスクリプトを実行したりすることで、発生する可能性がある問題を解決することができる。MySQL ログを使用したり、別のログを 1 つ追加したりするだけで、通常、データの整合性が失われることなく、完全にテーブルを修復することができる。
にあるように、自前で不整合修正を行う、っていうのが普通なんでしょうかね。
>>自前で不整合修正を行う、っていうのが普通なんでしょうかね。
そうですね。
MyISAMは、基本的に
・滅多に障害は起こらない
・いざ障害が起こってテーブルが壊れても、バックアップや更新ログから回復可能
ってことで、割とお気楽に作る前提が、基本だと思います。
複数テーブルをLockすれば
テーブルA
テーブルB
の更新は必ず一貫性のある状態に保たれるということでしょうか。
ほかのトランザクションによる影響ということではなく、
Aテーブル更新
<ここで何らかの原因により終了
Bテーブル更新
という状態を想定しています。