mysql のロック メカニズムはテーブル レベルのロックと行レベルのロックに分かれています。この記事では、mysql の行レベルのロックにおける共有ロックと排他的ロックの共有と交換について共有します。
共有ロックは、読み取りロック、または短縮して S ロックとも呼ばれます。名前が示すように、共有ロックは、複数のトランザクションが同じデータのロックを共有でき、すべてのトランザクションがデータにアクセスできることを意味します。読み取りのみが可能で、変更はできません。
排他ロックは書き込みロックとも呼ばれ、他のロックには共有ロックと排他ロックが含まれますが、排他ロックを取得したトランザクションはデータの読み取りと変更ができます。
共有ロックについては誰もがよく理解しているかもしれません。つまり、複数のトランザクションはデータの読み取りのみが可能で、データの変更はできません。しかし、排他ロックについては人によって理解が異なる可能性があります。最初に間違えました。排他ロック データ行が保存された後は、他のトランザクションはそのデータ行を読み取ったり変更したりすることはできないと考えられていますが、そうではありません。排他的ロックとは、トランザクションがデータ行に排他的ロックを追加した後は、他のトランザクションがその行に他のロックを追加できないことを意味します。 Mysql InnoDB エンジンのデフォルトのデータ変更ステートメント、更新、削除、挿入は、関係するデータに排他ロックを自動的に追加します。デフォルトでは、select ステートメントはロック タイプを追加しません。排他ロックを追加したい場合は、select ステートメントを使用できます。 ...for update ステートメント。共有ロックを追加するには、select ... lock in share mode ステートメントを使用できます。したがって、排他ロックが設定されたデータ行は他のトランザクションで変更できず、共有モード ロックで更新やロックを行うためにデータをクエリすることはできませんが、データは select...from... を通じて直接クエリできます。クエリにはロック機構がありません。
ここまで述べたので、次の簡単な例を見てみましょう:
次のテスト データがあります
これで、id=1 のデータ行に対する排他的なクエリができました。ここでは、トランザクションを開くために begin を使用しますが、トランザクションを閉じるのは表示されません。トランザクションをコミットするかローリングするため、これはテスト用です。戻るとトランザクションがロックを解放します。
クエリ ウィンドウを開く
データの一部がクエリされます。今度は別のクエリ ウィンドウを開いて、同じデータに対して排他クエリと共有ロック クエリを使用します。クエリの方法
排他クエリ
共有クエリ
排他的なクエリであることがわかります。ロックがオンになっている id=1 のデータは排他ロックでロックされており、ここでのブロッキングは排他ロックが解除されるのを待っているため、クエリと共有ロック クエリは両方ともブロッキング状態になります。
次のクエリを直接使用するとどうなるか
#データをクエリできることがわかります。
共有ロックを取得するトランザクションをもう一度見てみましょう。他のクエリでは、共有ロックを追加するかどうかのみが可能です。
データはクエリできることがわかりますが、排他的メソッドでは見つけることができません。 lock. 、排他ロックと共有ロックは同じデータに存在できないためです。
最後に、上記の mysql InnoDb エンジンの update、delete、insert ステートメントに排他ロックを自動的に追加する問題を検証します。今回、共有クエリはブロッキング状態にあり、排他ロックの解放を待っていますが、ロックメカニズムは排他ロックと相互排他的ではないため、通常のクエリを使用してデータを見つけることができますが、見つかったデータは古いデータですデータが変更される前。
次に、データを送信し、排他ロックを解除し、変更されたデータを確認します。このとき、排他クエリ、共有クエリ、および通常のクエリが使用できます。行データはトランザクションが送信された後に解放され、排他ロック、通常のクエリのみが下に表示され、他の学生が自分で確認できます。
結果が期待どおりであることがわかります。
推奨チュートリアル: 「Mysql チュートリアル 」
以上がmysqlの共有ロックと排他ロックの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。