ページレベルおよび行レベルのロックについて聞いたことがありますが、セッションおよび接続に関してそれらが使用されるのを聞いたことがありません。今日、(MySQL)DBAは行ロックについて話していましたが、それらのスコープは接続またはセッションレベルで設定できることを暗示していました。これは本当ですか、それとも私は彼を誤解しましたか?
接続が確立されたとき(またはセッションが開始されたとき)にロックが設定され、その接続/セッションが終了したときにロックが解除されることを知りませんでした。これに該当する場合、行/ページレベルのロックよりもどのような利点がありますか?前もって感謝します。
ある程度、そうです。
InnoDBに関しては、ロックできる行を選択できます。これは、DB接続の特定の設定ではありません。これは、UPDATEを実行する前に呼び出す必要がある特定のクエリです。
SELECT ... FOR UPDATE
SELECT ... LOCK IN SHARE MODE
これにより、これらのSELECTの結果セットに基づいて、排他的または共有の行ロックを開始できます。
これに関する詳細は MySQL Documentation にあります。
私はこれらを使用して以前の投稿を書きました:
Aug 08, 2011
: InnoDBデッドロックはINSERT/UPDATE/DELETE専用ですか?Jan 02, 2012
: 共有モードでロックMar 18, 2012
: 更新用に選択すると、インデックス付きの列でエラーが発生しますMay 09, 2012
: 行の更新時のトランザクションロックタイムアウトMay 13, 2012
: innodbテーブルの特定の行を更新できませんAug 10, 2012
; MySQLの類似関数NOWAITセッションと接続について
SELECT ... FOR UPDATE
を実行すると、更新する行のロックが開始され、他のDB接続による読み取りが許可されます。SELECT ... LOCK IN SHARE MODE
を実行すると、本質的に逆のことが行われますSELECT ... FOR UPDATE
または直接DMLを実行しないようにするこれらのSELECT
クエリを使用することで私が目にする唯一の利点は、ページでの不要なデッドロックを防ぐことです。
これが役に立てば幸いです!!!
これに該当する場合、行/ページレベルのロックよりもどのような利点がありますか?
彼の意味を誤解しているかもしれません。
クライアント接続とセッションは本質的に同じものです。セッションは、クライアントの認証後に開始され、クライアントが切断すると終了します。 (これらはドキュメントではスレッドとも呼ばれます。各接続/セッションには通常、それを処理する専用のサーバースレッドがあります。)
MySQLのすべてのロック- 行ロック 、 テーブルロック 、および 名前付きロック (これらはデータ構造ロックではなく、助言的mutexです)-ですロックを作成したセッションに常に関連付けられ、保持されます。
次のステートメントは、テーブルレベルのロックに関するMySQLのドキュメントからの抜粋ですが、すべてのロックに当てはまります。
セッションは、それ自体のロックのみを取得または解放できます。 1つのセッションが別のセッションのロックを取得したり、別のセッションが保持しているロックを解放したりすることはできません。
明示的に解放されない場合、ロックを保持しているセッションが終了すると、すべてのロックが常に自動的に解放されます。セッションは、クライアントが切断するか、クライアントスレッドが killed になるか、または interactive_timeout
または wait_timeout
タイマーはセッションに適用されます。
したがって、これらの意味で、ロックはセッションに「スコープ」されていると言えるでしょう。ただし、ロックのスコープと影響は常にグローバルです。それが当てはまらない場合は、ロックすることにあまり意味がありません。これは、他のセッションがスレッドの動作と競合することをしないようにするために正確に存在します。
InnoDBは、レコードロックとテーブル全体のロックの共存を可能にする複数の粒度のロックをサポートしています。複数の粒度レベルでのロックを実用的にするために、意図的ロックと呼ばれる追加のタイプのロックが使用されます。インテンションロックは、InnoDBのテーブルロックです。意図的ロックの背後にある考え方は、トランザクションが、そのテーブルの行に対して後で必要になるロックのタイプ(共有または排他)を示すことです。 — http://dev.mysql.com/doc/refman/5.5/en/innodb-lock-modes.html
これはSELECT ... LOCK IN SHARE MODE
(「意図共有」行ロックを取得)およびSELECT ... FOR UPDATE
( "Intention Exclusive"行ロックを取得)ステートメント。行のロックを意図的に取得することができます...しかし、正確には、これらはセッションレベルではなく、さらに詳細です。セッションのサブセットであるトランザクションレベル。現在のトランザクションをCOMMIT
またはROLLBACK
するとすぐに、これらは解放されます。もちろん、セッションが予期せず終了した場合、トランザクションはロールバックされ、ロックも解放されます。