2013-11-24 9 views
12

データベース内のテーブルに到達しようとしている2人のユーザーが、 User1が= 10InnoDBエンジンの行レベルロックとMySQLデータベースのMyISAMエンジンのテーブルレベルロックの違いを明らかにする

UPDATEコメントSETコメントID = 10

  • User2が、すべての行の選択作っている= "Hello World" のIDを持つレコードのために作ると、更新され

    1. 同じテーブルコメント

      SELECT *私は、次の例の違いを議論したいコメント

    FROM:

    1. テーブルのエンジンはMyISAMテーブルの場合:更新クエリがキューに入れます テーブル全体をロックします の更新が行われるまで選択クエリが実行され、実行されます。 ユーザーは、更新が完了するまで が完了するまで、このテーブルから何も要求しません。
    2. テーブルのエンジンがInnoDBの場合:更新クエリは更新された行をロックします。

    私はこのロックがどのようにSELECT QUERYに影響していますか?

    私は、selectがデータベースにコメントテーブルの全レコードを要求し、そのうちの1つ(id = 10)がロックされていることを意味します。

    「はい」の場合、2つのエンジンの違いは何ですか?

    もし私が私のウェブサイトで同じ状況があり、私のテーブルエンジンをMyISAMからInnoDBに変更したとしたいのですが、更新や挿入クエリがあったときにリクエストをキューに入れてしまう問題があります。

    この状況の説明は非常に役立ちます。事前にありがとう

  • +0

    この例では、両方のエンジンの更新が完了するまでselectが待機する必要があります。 selectクエリにID 10(更新によってロックされている)のレコードが含まれていない場合は、このケースではMyISAM selectが待機する必要がありますが、InnoDBはそうではありません。 "InnoDBのこの機能は並行性と呼ばれています" - http://stackoverflow.com/a/28070969/934739 –

    答えて

    1

    InnoDBでは、トランザクションが有効かどうかによって異なります。 InnoDBにはMVCC機能があります。つまり、スレッド1が更新されている間は、スレッド2はロックなしで読み取ることができます。トランザクションが無効になっている場合

    が、これはすでにMyISAMのと同じ、ここInnoDB's row locking the same as MVCC Non-Blocking Reads?

    に答えていますか?私はそう思うが確かではない。

    +0

    すべてのテーブルがInnoDBに変更されています。テーブルはInnoDBでも可能ですか?はいの場合どのように無効になっているかどうか、有効にする方法を知ることができます – Basel

    +0

    @Basel自動コミットをオフにしてから現在の接続を無効にすると意味します。トランザクションを使用するには、 "SET autocommit = 0; START TRANSACTION; UPDATE ....; COMMIT;" –

    0

    あなたのシナリオでは、選択されたクエリでは結果が返されますが、更新されていない場合はid = 10の行の古いデータが返されます。結果は停止しません。

    関連する問題