• ベストアンサー

同時書き込み

mysqlを使おうと勉強中です mysqlに同時書き込みした場合についての質問です 例えば,5人のユーザーが同時に書き込んだとします。書き込むレコードは全て違います ユーザー1がレコード1行目に書き込み ユーザー2がレコード2行目に書き込み ユーザー3がレコード3行目に書き込み ユーザー4がレコード4行目に書き込み ユーザー5がレコード5行目に書き込み この場合は、普通のtableで処理できますか?

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

  • ベストアンサー
回答No.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を使えば万事解決というわけでもないようです。

flash0
質問者

お礼

お答えいただきありがとうございます。 勉強になりました 同じ行への書き込みがないようにうまくやってみることにしました MyISAMがmysqlの持ち味みたいなので MyISAMでとりあえずやってみます

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

普通は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

flash0
質問者

お礼

何も指定しないで下記の方法でテーブルをつくりました この場合は、MyISAMになるんですか? その場合、自動でテーブルロックしてくれるってことでしょうか? CREATE TABLE test ( id int(6), name VARCHAR(255) ) みなさんはphpやperlからmysqlを使う場合は、どのテーブルを使っていますか?InnoDBを使うのが一般的なのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 書き込みの衝突

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

    • ベストアンサー
    • MySQL
  • データの同時書込みについて

    MYSQLとPHPをつかって各支店からデータを入力してもらい、集計したいと考えています。 仮に各支店でまったく同時にデータを書き込むことがあったとするならデータはきちんと書き込まれるでしょうか? また、同時に複数の人間が書込みの操作をした場合、どのくらいの件数まで書込みできるでしょうか? 設定はどのような設定にするのが安全で確実でしょうか? テーブルのフィールドタイプはInnoDBとしています。 PHPのバージョンは4.3.8 MYSQLは4.0.26-ntです。 わかりにくい説明で申し訳ないです。 よろしくお願いします。

  • 同時にボタンを押されたとき

    こんにちは。 MySQLを使ったWebページ(Apache)をPHPで作成しています。 社内の本の管理ページを作ることをしています。 仕様としては本の情報の他にIDとして「英字3文字通し番号5桁」のユニークIDがあります。例えば小説ならば「NVL00123」、漫画なら「CMI00256」となります。これを自動生成したいと思います。 小説を登録しようと登録ボタンが押されたときに、テーブルから「NVL」の付く末番のレコードを見つけて+1すれば新しいIDになると思いますが、もし数人が同時に登録ボタンを押したときに新しいIDが同じになってしまうのではないかと心配になっています。 MySQLやApacheの挙動というものは分かりませんがスレッド的な動作だとすると、あるユーザーの処理が「NVL00124」というIDを生成したときに、本の情報のレコードをテーブルに追加するまでの間に、別のユーザーの処理が「NVL00123」を末番と判定していまうのではないかと心配です。 このような同時に登録ボタンが押されたときにユニークなIDを安全に生成するにはどのようにしたらよいものでしょうか?

    • ベストアンサー
    • PHP
  • 同一ユーザーが同時アクセスした時のトランザクション

    PHPとMySQLでWEBアプリを作っています。 複数の人がログインしてデータの書き換えが発生するので、トランザクションを扱いたいと考えています。 サイトや書籍を見て基礎はとりあえず頭に入ったのですが、自分の作っているアプリで一般的にどうやればいいのかピンときていません。 そこでいくつか疑問があるのですが、今回的を一つに絞って質問します。 質問 「同じアカウントのユーザーが別々のブラウザから同時にアクセスしてきても問題が無いようにする一般的なトランザクション処理の方法が知りたい」 現在既に出来ているアプリの流れが以下です。(かなり簡略化しています) <?php  始めにMySQLでユーザー情報の読み込み  MySQLでいろんな情報の読み込み  phpでいろんな処理  MySQLでいろんな情報の書き込み  (上記の一連の処理は何回も出てくる)  最後にMySQLでユーザー情報の書き込み ?> 書籍やサイトに載っているトランザクションの例だと、読み込みと書き込みの一連の流れが連続しているので単純にSTART TRANSACTIONしてCOMMITしている場合が多いです。 しかしこのアプリの場合ユーザー情報の読み込みと書き込みに間が空いているので、この間をSTART TRANSACTIONとCOMMITで挟む、というのはかなりおかしい気もします。 このような場合に同一アカウントからの同時アクセスでも整合性を保つにはどうやるのが一般的なのでしょうか。 根本的にphpプログラムとしてデザインが間違っているのかもしれませんが、あくまでMySQLのトランザクション処理での解決を目指している(もうプログラムはほぼ完成している)ので、MySQLのカテゴリで質問しました。でもそういう指摘もしてもらえるとありがたいです。 (ちなみにこのようなことはあくまでそういうアクセスをしてくる人のまれな状況のための対処であり、頻度としては高くないと思っていますがまずは最初の疑問としてあげました)

    • ベストアンサー
    • MySQL
  • 初心者にもなってませんが・・。

    データベースのあるサイトを作ろうと思っているのですが、 ・ユーザー・読み込み、書き込み許可 ・テーブルの中の、一つのIDのレコードを選択した時、 外部から書き込みした、フォームのような形で表示 このようなことは、MySQLかPostgresSQLで、できるのですか? どちらを勉強するか迷っています。

  • データベースの中身をテーブルで表示したいです

    mysqlデーターベースの中身をテーブルで表示したいのですがわからない事があるので書き込みしました。 テーブルAのデーターを <TABLE> <TR><TD>mysql1行目</TD><TD>mysql2行目</TD></TR> <TR><TD>mysql2行目</TD><TD>mysql4行目</TD></TR> </TABLE> <TD></TD>の間にレコード一つ分のデータを入れて2列で表示したいです。 whileを使ってデーターを取り出すと1行にレコード一つ分のデーターを表示するのはそのままできるんですが1行にレコード二つ分のデーターを出す場合<TR>と</TR>をどういう仕組みで表示させれば良いかわかりません。 誰か教えてもらえないでしょうか?

    • 締切済み
    • PHP
  • PHP+MySQLでの排他処理とDBクローズ

    <環境> Apache1.3.37 PHP4.4.6 MySQL4.0.27 PHPで、掲示板などのスクリプト作成を勉強しています。 これまで、ログをログファイルとして保存するように作成しておりましたが、データベースに保存するように変更している途中です。 そこで、教えていただきたいのは下記の2点です。 ・ロック処理の必要性 →ログファイルを作成するタイプの場合、同時アクセスによるファイル破損を防ぐため、ロック処理が必要でした。DBに変更した場合も同様に必要なのでしょうか? ・DBのクローズ処理 →最小限のソースを以下に記します。9行目のクローズ処理は必ず必要でしょうか?また、エラーが発生した場合、7行目で処理が終わるのですが、この直前にもクローズ処理を記入する必要があるのでしょうか? 1)<?php 2)$db = mysql_connect(host,user,pass); 3)mysql_select_db(db-name,$db); 4)$query = "INSERT INTO table(id,name) VALUES('1','なまえ')"; 5)if (!(mysql_query($query))) { 6) print = "書き込みに失敗しました。"; 7) exit(); 8)} 9)mysql_close($db); 10)?> 宜しくお願いします。

    • ベストアンサー
    • PHP
  • 同じサーバーで、異なるデータベースを同時に開くことはできますか?

    1.タイトルの通り、同時に開くことができますでしょうか? 日本PHPユーザー会ホームページでは以下の方法でできるとの回答があります。 $con1 = mysql_connect(localhost, user_id , pass); $con2 = mysql_connect(localhost, user_id , pass); mysql_select_db("db1",$con1); mysql_select_db("db2",$con2); ======================================== db1 user_table user_id(int),user_name(var) ========================================== db2 main_table main_id(int),user_id(int) ======================================== $sql_user_name = "SELECT user_name FROM user"; $result_user = mysql_query($sql_user_name,$con1); $row_user = mysql_fetch_array($result_user); echo $row_user[user_name]; のようにやっても mysql_fetch_array()がでます。 mysql_queryは最後の接続を活かすとなっているのでこの部分の書き方を教えてください。 2.できたとしてリレーションを行うことができますでしょうか? つまり $sql_user_name = "SELECT user_name FROM db1.user_table,db2.main_table WHERE db1.user_table.user_id = db2.main_table.user_id" というようなことはできますでしょうか? 長文で申し訳ありませんが、どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQLの書き込みで同時アクセスがどのくらい以上になるとパフォーマン

    MySQLの書き込みで同時アクセスがどのくらい以上になるとパフォーマンスが低下するのでしょうか。

    • ベストアンサー
    • MySQL
  • DB(MySQL)から複数行のデータを取り出す方法

    最近PHPを勉強していて、初歩的な質問で申し訳ないのですが どうしてもわからないので質問させていただきます。 例えば、MySQLに以下のようなデータがあります。   年齢 名前 性別   28  AAA  男   20  BBB  男   25  CCC  女 ここで男のレコードだけ取り出したいと思い 以下のようなコードを書きました。   //MySQLへデータを保存する。   mysql_connect("localhost","root","");   mysql_select_db("DB名");   //データの取得   $id = mysql_query("SELECT '年齢','名前','性別' FROM テーブル名 WHERE '性別' = '男'");   $array=mysql_fetch_row($id); この場合、2行のレコードが選ばれるはずですが 後ろのレコードへのアクセスの仕方がわかりません。 $arrayには性別=男に該当する、一行目のレコードが入っています。 二行目のレコードへはどうやってアクセスすればよいのでしょか? 調べてもなかなかうまくいかずご質問させていただきました。 ご回答お願いします。

    • ベストアンサー
    • PHP