• ベストアンサー

書き込みの衝突

MYSQL初心者です。 簡単なメッセ機能を作りたいと思っています。 MyISAMテーブルを使おうとしています テーブルロックならしようとおもえばなんとかできます 質問(ロックしなかった場合) 複数の人が同時に書き込んだ(INSERTした)ときにどんな壊れ方をするんでしょうか? 一番最後の書き込まれた行だけ壊れるんですか? 壊れ方はどんなふうになるんですか?書き込まれないだけですか? 壊れた後でも、書き込みはできますか? テーブルロックしておけば重複したINSERTはふせげますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 単一のテーブルの単一のデータは、どんなパターンでinsert・updateなどをしても「壊れる」ことはありません。このための保護は、全て、MySQLが自動でやってくれます。  ただし、システムとしてデータが壊れないのと、論理的な意味でデータが壊れないのは話が別です。  よく、例に挙げられるのが、銀行口座の残高。  Aさんの口座から、千円引き出すとします。   a1.Aさんの口座の残高を確認し   a2.その残高から千円を引いて   a3.Aさんの口座残高を新しい値にupdateします。  さて、ここで、Aさんの口座に、千円振り込むとします。やっぱり、   b1.Aさんの口座の残高を確認し、   b2.その残高に千円を足して、   b3.Aさんの口座残高を新しい値にupdateします。  ここで、この二つの処理が同時に発生したとします。  処理の順番は、その時の運によってどうにでもなります。a1,b1,b2,a2,a3,b3かもしれないし、他の順番かもしれません。  考えられる順番で、最後の残高がどうなるか考えてみてください。    なんのロック処理もしなくても、データベースファイルが壊れることはありません。でも、正しいロック処理をしなければ、多分、この銀行は壊れます(笑)

flash0
質問者

お礼

回答ありがとうございます 単一テーブルです。ロック処理は必要ないんですね 気軽なサイトなのでロックしないで使うことにしました。ありがとうございました(_ _

その他の回答 (2)

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.3

 No.2です。  書き忘れ、補足。  もし、調べるのであれば、「トランザクション」とか、「分離レベル」などの単語で検索してみてください。この類の話題が、わんさかと引っかかります。  ちなみに、先の例での正しい処理は、update文一発でやることなんですが・・・話を単純化するためにあえて、処理をselect・計算・updateと分離してあります。あしからず。

flash0
質問者

お礼

ありがとうございました

  • hardgeek
  • ベストアンサー率50% (7/14)
回答No.1

通りすがりのMySQLerです。 テーブルは自動的にロックされるので更新が競合してデータが壊れるというような心配はありません。 更新処理にはINSERT、UPDATE、REPLACE、DELETE等がありますが、通常これらの処理をしようとすると(MySQLが自動的に)対象のテーブルに排他ロックをかけます。なので同時にひとつのスレッドしか更新ができません。排他ロックがかかっている間は他のスレッドは更新、参照ともにできなくなってしまいますので、更新処理が長くかかる場合には全体的な性能の足を引っ張ってしまいます。ただし、MyISAMの場合INSERTだけは少し特殊で、同時挿入という機能があり、条件があえば参照中にも新しい業の挿入ができるようになっていますので、INSERTは参照の性能の足を引っ張る可能性は低くなります。 MyISAMの場合は、テーブルを更新している間にPCの電源を落としたりするとテーブルのデータが壊れますが、そうでなければ大丈夫です。ちなみに、InnoDBなら複数のスレッドが同時に同じテーブルを更新できるし、PCの電源をいきなり落としてもクラッシュリカバリしてくれるので、本気でサービスを運用するとか、データベースについて学習したいならInnoDBのほうがいいと思います。

参考URL:
http://dev.mysql.com/doc/refman/5.6/en/concurrent-inserts.html
flash0
質問者

お礼

回答ありがとうございます mysqlのバージョンは5.1.22でした 例えば mysql_query('LOCK TABLES mes WRITE'); など使わなくても、MyISAMでも自動で排他ロックをかけてくれるのですか?