テーブルロックの使用方法とは?

このQ&Aのポイント
  • テーブルロックはデータベースの更新や削除操作において、複数のユーザーが同時に実行する可能性がある場合に使用されます。
  • INSERTなどの操作では通常テーブルロックは必要ありません。
  • 掲示板などの機能を持つサイトにおいては、テーブルロックの使い方は実装やデータの持ち方によって異なる場合があります。
回答を見る
  • ベストアンサー

どういう時にテーブルロックを使用するのでしょうか

PHPのサンプルにテーブルロックがあったのですが、 使いどころが分からないので、教えてください。 どういう時にテーブルロックを使用するのでしょうか。 サンプルの解説だと、 「LOCK TABLES」構文を使って会員と管理者が同時に実行する可能性がある更新と削除で テーブルをロックします、 とあるのですが、 例えば、:INSERTとかでは、テーブルをロックしなくてよいのでしょうか? これまで、気にしたことはなかったのですが、 例えば、(テーブルロックをしていない)掲示板で、たまたま同時に書き込みをしたり、しても、特に問題ないのでしょうか? どういう時に、テーブルロックをして、 どういう時にテーブルロックをしなくてよいか、分かりません。 例えば、同じ掲示板の機能を保持するサイトが複数あった場合、 テーブルロックというのは、 大体、処理別でこういう風にする、と決まっているようなものなのでしょうか? あるいは、データの持ち方によって、 それこそサイト毎に、実装(どこでロックするか等)はそれぞれ変わってくるようなものなのでしょうか?

  • re999
  • お礼率61% (476/777)
  • MySQL
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

MySQLのInnodbエンジンなら基本は行ロックです。 しかし、行ロックはロックの粒度が細かい分、管理するリソースが大きくなりがちです。 このような場合、テーブル全体をロックして処理するほうがパフォーマンスが上がる場合があります。 もちろん、LOCK TABLEでロック中は他のセッションから更新できませんから、常にこのようなやり方が有効な訳ではありません。

関連するQ&A

  • トランザクションとテーブルロック

    初心者の質問で申し訳ありません。 トランザクションで複数のテーブルを更新する時、テーブルロックはかかっているのでしょうか。 具体的に言うと、 BEGIN TRAN a  INSERT INTO A VALUES('data1')  INSERT INTO B VALUES('data1','data2')  INSERT INTO C VALUES('data1','data2','data3') COMMIT TRAN a とするとき、テーブルA,B,Cはあらかじめロックしておく必要があるのでしょうか。 アドバイスお願いいたします。

  • テーブルロックが必要ですか?

    mysqlとphpを使ってwebシステムを製作しているのですが、素人なもので以下の方法で効率がいいプログラムなのかわかりません。ご意見をいただけないでしょうか。 ----------------------------------------------- テーブル a (id,comment,no) $query="LOCK TABLES a READ, a WRITE"; $rst = mysql_query($query,$con); $query="SELECT count(*) as number FROM a WHERE id='任意の数字'"; $rst = mysql_query($query,$con); $col = mysql_fetch_array($rst); $no = $col["number"]+1; $query = " INSERT INTO a(id,comment,no) VALUES('任意の数字','コメント','$no')"; $rst = mysql_query($query,$con); $query="UNLOCK TABLES"; $rst = mysql_query($query,$con); idごとの投稿数+1をコメントnoとして割り振りたいです。結果をweb上にSELECTするとこんな感じになります。 id=1 の画面 no1 こんにちは no2 はい、こんにちは no3 昨日は何をしてましたか 以下、続く id=2 の画面 no1 暇だけどだれかいますか no2 はい、います no3 何してますか? 以下、続く ------------------------------------------------------------ (質問1) テーブルロックを使用せずに、1つのSQL文で済ませられないでしょうか? (質問2) テーブルロックの最初の行はどちらがいいのでしょうか? (両方動作しますが、どちらを選びますか?)  (1) $query="LOCK TABLES a READ, a WRITE";  (2) $query="LOCK TABLES a "; 環境: mysql5.0(MyISAM)/ php5.1系

    • ベストアンサー
    • MySQL
  • JAVA+MySQLのテーブルロックについて

    Java + MySQL5(MyISAM)でテーブルをロックする処理をかけようと 試みているのですが、上手くロックが掛からずにエラーになります。 テーブル「AAA」と「BBB」にロック処理を行おうと思います。 Connection con = null; Statement ps = null; String sql = null; Class.forName("com.mysql.jdbc.Driver"); con = (Connection) DriverManager.getConnection(url, user, pass); ps = con.createStatement(); sql = "LOCK TABLES AAA WRITE,BBB WRITE"; int a = ps.executeUpdate(sql); sql = "UPDATE AAA SET ~省略~"; a = ps.executeUpdate(sql); sql = "INSERT INTO BBB SET ~省略~"; a = ps.executeUpdate(sql); sql = "UNLOCKS TABLES"; a = ps.executeUpdate(sql); 上記の記述でどこに誤りがあるのでしょうか? お知恵を拝借できないでしょうか。 宜しくお願い致します。

  • 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が必要になってくるのでしょうか? よろしくご教授おねがいします

  • iBatisでのロック、コミットとロールバック

    お世話になります。 現在、javaで以下のような処理を考えています。 1.空っぽのLockテーブルをロックする。ロックできた人だけ、以下の処理を行う。  ロックできなかった人は待ち状態。 2.selectとかupdateとかinsertとか、Httpリクエスト投げたりレスポンス受け取ったり。  select,update,insertするテーブルはLockテーブルではない。 3.2の処理が全て成功したら、1でロックしたテーブルをコミットして解除。  どこかで失敗したら全部ロールバック。 これを、以下の環境で実装したいです。 ・Java 1.6.0_16 ・Spring 2.5.1 ・iBatis 2.3.0.677 ・PostgreSQL 8.3.8 iBatisでLockとLockの解除、コミットとロールバックを行う方法が分かりません。 どなたかご存知でしたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • 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
  • データー登録、更新時のファイルロックは必要なのでしょうか?

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

  • MYSQL LOCK TABELSについて

    お世話になります、 さくらのレンタルサーバを使っているのですが テーブル更新時に更新対象テーブルにロックを かけようとして、動作確認をしているのですが phpmyadminから lock tables *** writeを実行した後 select文を発行するとそのままselectが 動いてしまうのですが、なにかテーブルロックに 関して間違った理解をしているのでしょうか? 伝票NOテーブルのようなものは重複を防止する為に 排他かけないと駄目だと思うのですが、 それとも更新クエリが発行された時に自動で 排他制御がかかるのでしょうか? わからなくなってきました。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • PHPでSQLサーバーのテーブルに対してIO

    PHPでSQLサーバーのテーブルに対して Insert、Update、Deleteを行うサンプルコードを得られるサイトがあればご紹介下さい。

    • 締切済み
    • PHP
  • 書き込みの衝突

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

    • ベストアンサー
    • MySQL