• 締切済み

MySqlのロックについて

MySql初心者ですのでお手柔らかにお願いします。 最近MySqlにロックという機能があることを知りました。 同時にデータベースの操作がされると困る場合にロックするのだと思うのですが、そういうことって結構起こるのでしょうか? updateの場合、取得してから更新するまでラグがあるので問題が起こるのはイメージできるのですが、insertする時にも起こりえるのでしょうか? だとすればどんな操作でもロックはするに越したことはないように思えますが、オプションで用意されてるということは必要な場面とそうでない場面があるということなのでしょうか。 また、不具合が起こるのであれば自分で実際に試してみたいのですが、そもそも同時に操作を行うやり方がわかりません。 意図的に不具合を出しながらテストする方法があれば教えていただけないでしょうか。 よろしくお願いします。

  • MySQL
  • 回答数1
  • ありがとう数11

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

エンジンにもよりますが基本は自動ロックでユーザーが任意におこなう 必要はないものだと考えてよいでしょう。 とくにトランザクション処理すればデータ競合もほぼ問題ならないです。

関連するQ&A

  • データー登録、更新時のファイルロックは必要なのでしょうか?

    PHPとMySQLを組み合わせて、簡単なデーターベースを作っています。 非公開で、それほど多くの人がアクセスするわけではないのですが、同時使用もありえる状況で新規書込みと内容の更新などが同時に発生する状況も考えられます。 通常のphpのシステムとかですと、ファイルロックについて、いろいろと書かれているのですが、MySQLシステムでファイルロックについて(テーブルロック?)探してもよくわからないのです。 だれかがinsertやupdateしていると、自動的に排他状態になったりしているのでしょうか?

  • MysqlでのLOCK処理

    Mysqlのwebリファレンスの http://dev.mysql.com/doc/refman/4.1/ja/lock-tables.htmlでは --->個々の UPDATE ステートメントでは、いずれも処理が原子的に行われるため、通常、テーブルをロックする必要はありません。現在実行中の SQL ステートメントが、他のスレッドによって妨害されることはまったくありません。しかし、次に示すように、テーブルをロックする必要が生じる場合もいくつかあります。 トランザクションをサポートしていないストレージエンジンを MySQL で使用している場合、SELECT と UPDATE の間に他のスレッドに割り込まれないようにするには、LOCK TABLES を使用する必要がある。次の例では、安全に処理を実行するために LOCK TABLES を発行する必要がある。<--- と説明がありますが、 (1)トランザクションをサポートしていないストレージエンジンでINSERT INTO,DELETE処理をするにはLOCKが必要になってくるのでしょうか? よろしくご教授おねがいします

  • mysql のテーブルロックについて

    Mysqlにてテーブルをロックしようとして以下2つの方法を試し疑問に思ったので質問します。 1.select for update によるテーブルロック 以下のselect for update(where句にレコードを一意に特定できない条件を指定) をコマンドライン で実行。 select * from test where test_state=0 for update; 別に起動したコマンドラインから下記アップデート文を実行したところ ロックされることが確認できました。 update test set test_official=0 where test_id = 1; しかし、最初に実行した select for update 文を下記のようにしたところ上記update文はロックされず に実行されてしまいました。 select * from test where test_state is null for update; これはなぜでしょうか。

    • ベストアンサー
    • MySQL
  • MySQLで先頭の0が省略されてしまう

    こんにちは、 Mysqlで、例えば"023"という数字をデータベースへinsertした場合、 先頭の"0"が省略されてしまい、"23"となって格納されてしまいます。 データ型はint、textを試しましたが結果は同じでした。 検索してもいまいちこれといった情報が見つからず、 教えていただきたいと思っています。 簡単ではありますが、どうかよろしくお願いします。 環境:windowsOS    xampp 1.7.1 php5を使ってMysqlを操作しております。

    • ベストアンサー
    • MySQL
  • MySql5でのネクストロックについて

    mysql5(repeatable read)のロック機構について勉強しています。 [sample1(主キー:id)] +----+---+ | id | point | +--+-----+ | 10 | 10 | | 15 | 15 | | 20 | 20 | | 25 | 25 | | 30 | 30 | +--+-----+ 上記のようなテーブルに対して、以下の2つのスレッド(A,B)にて SQLを発行した際、☆1部分は即時に実行されます。 (A) start transaction; (A) select * from sample1 where id >= 15 and id <= 25 for update;  (B) start transaction;  (B) insert into sample1 values(14, 14); #☆1  (B) rollback; (A) rollback; しかし、以下の2つのスレッド(A,B)にて SQLを発行した際、☆2部分は即時に実行されません。(スレッドAのロック解除待ちになります) (A) start transaction; (A) select * from sample1 where id >= 15 and id <= 25 for update;  (B) start transaction;  (B) insert into sample1 values(26, 26); #☆2 (A) rollback;  (B) rollback; ネクストロックという機構があることは存じているのですが、その具体的な仕組みがよくわかりません。 どうして、☆1が即時に実行され、☆2はロックがかかってしまうのでしょう?

    • ベストアンサー
    • MySQL
  • MySQLのデータファイルの位置について

    MySQLでテーブル、データベースを作成したのですが、 OS上から作成したテーブル・データベースが保存されているファイル(データファイル?) が見つけられません。 テーブルにデータをインサートしてコミットして、 セレクトを行ってデータは反映されていることは確認しています。 OSはWindows 7 MySQLのバージョンは5.5です。 user_dbというデータベースを作成し、 show databasesを行った結果、 information_schema mysql performance_schema test user_db が表示されることから、データベースuser_dbは正常に作られていると思います、 user_dbに対して、インサートは可能で、一度データベースを停止して、 再起動後、インサートしたデータがみれています。 しかし、インストールフォルダのMy.iniのdatadirで指定されているフォルダには mysql performance_schema のフォルダしかない状態です。(ここにuser_dbフォルダが作成されると思うのですが) どこにデータが保存されているのでしょうか?

    • ベストアンサー
    • MySQL
  • INSERTにおいてロック処理は必要か

    データベースでのロック処理に関する初歩的な質問です。 とあるテーブルのとある行をSELECTして、しかる演算処理の後に同じテーブルにUPDATEするときには、ロック処理が必要であることは理解できるのですが、 単純に独自のデータをテーブルにINSERTする場合、ロック処理は必要なのでしょうか? このテーブルには頻繁にユーザーがアクセスしてSELECTもUPDATEも走っている状態です。

    • ベストアンサー
    • MySQL
  • ロックについて

    データベース初心者ですが、よろしくお願いします。 トランザクション処理のロック制御について質問です。 例えば、ユーザAが表に対しupdateを行い、commitを行わなかったとします。このときに、他のユーザBがその表に対しupdateを行った場合、エラーになるのでしょうか? 私は、トランザクション処理というのは、表操作を行ってからcommitするまでの間をひとくくりとして、その間はロックがかかると認識しています。 どなたかご教授願います。

  • mysqlのalter table中のロックについてです。

    mysqlのalter table中のロックについてです。 下記のように、alterでテーブルを再構築中に同じテーブルにinsertが実行された場合、 接続Bのinsertはブロックされるかと思うのですが、テーブルが大きくalterに時間がかかる場合、 タイムアウトなどは発生するのでしょうか。 またもし発生する場合、タイムアウト値の設定などの確認方法はあるのでしょうか。 1.接続A  alter table table1 add columnB int(11) ; 2.接続B(接続Aのalter実行中)  insert into table1(columnA) values('aaa');

    • ベストアンサー
    • MySQL
  • PHPでMySQLテーブルロック一覧取得

    PHPでMySQLテーブルロックされている一覧を取得したいですがどのようにすれば良いかご教授願います。 Web検索で調べるとロック状態はmysql_list_processesや、show processlistでも試してみましたが、思うような結果は得られませんでした。正常には動作していますが、欲しいデータが取り出せないですす。。。 単純に、現在ロックしているテーブル名(レコードロックは不要です。)を一覧で出力させることはできないのでしょうか? PHPから実施できるやり方をご教授頂けると幸いです。 -------Test Program()--------- <?php $link = mysql_connect('localhost', 'login_id', 'login_pass'); mysql_select_db('db_name'); mysql_query('LOCK TABLES table1 WRITE'); mysql_query('INSERT INTO table1 SET field1 = "test", field2 = "1"'); //$result = mysql_list_processes($link); 以下のSQL文とも入れ替えて試しました。 $result = mysql_query('show processlist'); while ($row = mysql_fetch_assoc($result)){ printf("%s %s %s %s %s %s %s %s\n", $row["Id"], $row["User"], $row["Host"], $row["db"], $row["Command"], $row["Time"] , $row["State"], $row["Info"]); } mysql_free_result($result); mysql_query('UNLOCK TABLES'); ?>

    • ベストアンサー
    • MySQL