2011-10-21 9 views
0

これは2つの部分からなる質問です。私がテーブルでSELECTを実行するとき、SELECTが実行されている間、そのテーブルを任意の使用法からロックしていますか?テーブルでSELECTを実行するときにテーブルをロックしていますか?

もしそうなら、SELECTステートメントの実行中にテーブルをロックしない方法は何ですか?私はMySQL 4.1.20 MyISAMを使用しています。

更新がここに同様の質問Any way to select without causing locking in MySQL?ありますが、答えはテーブルロックと行ロックがありますMyISAMの

+3

軽いタンジェントですが、なぜまだ4.1になっていますか? –

+1

これは前にここで答えた:[1] [mysqlのNOLOCK quivelant] [1]:http://stackoverflow.com/questions/917640/any-way-to-select-without-causing-locking- in-mysql – Jacque

+1

ロックは悪く、通常は完全に不要です。 –

答えて

-1

それについて考えてみましょう:あなたはあなたのSELECTを行うときにテーブルのセルを変更していますか?もしそうでなければ、テーブルをロックする必要はありません.MySQLはテーブルをロックする必要はありません。テーブルロックは、SELECT時ではなく、UPDATE時に発生する必要があります。

+0

MyISAMは、選択を行う際にテーブルレベルの読み取りロックをテーブルに置きます。より詳細なロックを適用します。しかし、要点は、選択してもロックを適用することですが、一部のストレージエンジンでは分離レベルに依存します。 (そして、他のDBは別のルートに行き、ロックを回避するためにMVCCを使用します) – nos

2

はい、MyISAMテーブルでは、selectは挿入/更新のためにテーブルをロックします。しかしながら、いくつかの選択は同時に実行することができる(すなわち、それは読み出しロックを適用する)。テーブルの中央に空き領域がない場合、インサートは(内部)ストレージの末尾にデータを追加し、それらのインサートは選択と並行して実行できます。

詳細情報here。 MyISAMとInnoDBはこの点で非常に異なって動作することに注意してください。

+0

ロックを防止する方法は何ですか?どうやって汚い読書をすることができますか? –

+0

@ dev.e.loperあなたはinnodbに切り替えて、分離レベルを "read uncomitted"に設定します。 – nos

関連する問題