- ベストアンサー
同時書き込み
mysqlを使おうと勉強中です mysqlに同時書き込みした場合についての質問です 例えば,5人のユーザーが同時に書き込んだとします。書き込むレコードは全て違います ユーザー1がレコード1行目に書き込み ユーザー2がレコード2行目に書き込み ユーザー3がレコード3行目に書き込み ユーザー4がレコード4行目に書き込み ユーザー5がレコード5行目に書き込み この場合は、普通のtableで処理できますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
やはり先の回答で書いておくべきだったかもしれませんが、 質問にある例では各ユーザーが別々のレコードに書き込みをしていますよね。 この場合だとお互いの書き込みが他のユーザーの書き込みに影響を及ぼさないのでロックを取る必要が無いと思います。あと、ちょっと気になったので調べた感じだと、UPDATEで更新する場合もロックは不要みたいですね。 > 何も指定しないで下記の方法でテーブルをつくりました > この場合は、MyISAMになるんですか? そうです。 InnoDBを使うにはテーブル作成時に明示する必要があります。 http://dev.mysql.com/doc/refman/4.1/ja/using-innodb-tables.html > その場合、自動でテーブルロックしてくれるってことでしょうか? してくれません。 自分で明示的にテーブルをロック / アンロックしてください。 http://dev.mysql.com/doc/refman/4.1/ja/lock-tables.html あと、MyISAMはトランザクションセーフテーブルではないので、いわゆるトランザクションには使えないと思います。トランザクションの場合はCOMMITをするまで値が反映されてはいけませんので。 http://dev.mysql.com/doc/refman/4.1/ja/commit.html http://dev.mysql.com/doc/refman/4.1/ja/table-types.html > みなさんはphpやperlからmysqlを使う場合は、どのテーブルを使っていますか?InnoDBを使うのが一般的なのでしょうか? MyISAMが一般的だと思いますが、適材適所ではないでしょうか。 例えばwordpress (http://ja.wordpress.org/) ではデフォルトのMyISAMを使っているようです。 自分が見た範囲では特にLOCK TABLESも登場しないように思います。 UPDATEは時々出てきますが、UPDATEによる更新はアトミックな処理になるようなので行の更新をする程度ならロックを取る必要はないのかもしれません。 http://dev.mysql.com/doc/refman/5.1/ja/ansi-diff-transactions.html かつてMySQLを選ぶ理由はトランザクションがない代わりに速いということだったので、色々と工夫をしてMyISAMを使うというのが普通なのかもしれません。しかしながら、MyISAMにはトランザクションの機能がないので、InnoDBを普通は選ぶべきという意見もあります。 Top 10 MySQL Mistakes Made By PHP Developers http://www.sitepoint.com/mysql-mistakes-php-developers/ | 1. Using MyISAM rather than InnoDB ただ、この記事へのコメントでDavidさん他多数がMyISAMよりInnoDBは非常に遅くて使いものにならないし、DBの設計を適切にすればMyISAMでも問題なく使えると主張しているので、InnoDBを使えば万事解決というわけでもないようです。
その他の回答 (1)
- hanabutako
- ベストアンサー率54% (492/895)
普通はInnoDBだと思います。 http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-locking-reads.html 質問しているのは行ロックをMySQLでデフォルトのMyISAMでとれるかだと思うのですが、MyISAMではテーブル単位のロックしかありません。 http://dev.mysql.com/doc/refman/5.1/ja/internal-locking.html
お礼
何も指定しないで下記の方法でテーブルをつくりました この場合は、MyISAMになるんですか? その場合、自動でテーブルロックしてくれるってことでしょうか? CREATE TABLE test ( id int(6), name VARCHAR(255) ) みなさんはphpやperlからmysqlを使う場合は、どのテーブルを使っていますか?InnoDBを使うのが一般的なのでしょうか?
お礼
お答えいただきありがとうございます。 勉強になりました 同じ行への書き込みがないようにうまくやってみることにしました MyISAMがmysqlの持ち味みたいなので MyISAMでとりあえずやってみます