ホームページ  >  記事  >  データベース  >  MySQL の共有ロックと排他ロックの使用法を共有する

MySQL の共有ロックと排他ロックの使用法を共有する

零下一度
零下一度オリジナル
2017-04-21 15:56:393421ブラウズ


MySQL の行レベルのロック、テーブルレベルのロック、ページレベルのロックの中で、行レベルのロックが MySQL で最も詳細なロックであることを紹介しました。行レベルのロックはデータベース操作の競合を大幅に軽減します。 。行レベルのロックは共有ロックと排他ロックに分けられ、共有ロックと排他ロックの概念や使い方、注意点について詳しく紹介します。

共有ロック

読み取りロックとも呼ばれる共有ロックは、読み取り操作によって作成されるロックです。他のユーザーは同時にデータを読み取ることができますが、すべての共有ロックが解放されるまで、トランザクションはデータを変更する (データの排他的ロックを取得する) ことはできません。

トランザクション T がデータ A に共有ロックを追加した場合、他のトランザクションは共有ロックを A にのみ追加でき、排他ロックを追加できません。 。共有ロックが付与されたトランザクションはデータの読み取りのみが可能で、データを変更することはできません。 T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。

用法

SELECT ... LOCK IN SHARE MODE;

在查询语句后面增加LOCK IN SHARE MODE,MySQL 就会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。

排他锁(Exclusive Lock)

排他锁又称写锁、独占锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

用法

SELECT ... FOR UPDATE;

在查询语句后面增加FOR UPDATE,MySQL 就会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。

意向锁(Intention Lock)

意向锁是表级锁,其设计目的主要是为了在一个事务中揭示下一行将要被请求锁的类型。InnoDB 中的两个表锁:

  • 意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁;

  • 意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。

意向锁是 InnoDB 自动加的,不需要用户干预。

对于INSERTUPDATEDELETE,InnoDB 会自动给涉及的数据加排他锁;对于一般的SELECT语句,InnoDB 不会加任何锁,事务可以通过以下语句显式加共享锁或排他锁。

共享锁:SELECT ... LOCK IN SHARE MODE;

排他锁:SELECT ... FOR UPDATE;

使用法🎜🎜SELECT ... LOCK IN SHARE MODE;🎜🎜クエリ ステートメントの後に LOCK IN SHARE MODE を追加すると、MySQL はクエリ結果セットの各行に共有ロックを追加します。他のスレッドがクエリ結果セットの行に対して排他ロックを使用していない場合は、共有ロックを正常に適用できます。そうでない場合は、ブロックされます。他のスレッドも共有ロックを使用してテーブルを読み取ることができ、これらのスレッドは同じバージョンのデータを読み取ります。 🎜🎜排他ロック🎜🎜排他ロックは、書き込みロックおよび排他ロックとも呼ばれます。トランザクション T がデータ A に排他ロックを追加すると、他のトランザクションはいかなる種類のロックも追加できなくなります。 A を封鎖します。排他的ロックが付与されたトランザクションは、データの読み取りと変更の両方が可能です。 🎜🎜使用法🎜🎜SELECT ... FOR UPDATE;🎜🎜クエリ ステートメントの後に FOR UPDATE を追加すると、MySQL がクエリ結果を更新します。排他ロックは各行に追加されます。他のスレッドがクエリ結果セット内の行に対して排他ロックを使用していない場合は、排他ロックを正常に適用できます。そうでない場合は、ブロックされます。 🎜🎜インテンション ロック (インテンション ロック) 🎜🎜 インテンション ロックはテーブルレベルのロックであり、その主な設計目的は、トランザクションの次の行に要求されるロックのタイプを明らかにすることです。 InnoDB の 2 つのテーブル ロック: 🎜
  • 🎜意図共有ロック (IS): トランザクションがデータ行に共有ロックを追加する準備をしていることを示します。 1 つのデータ行が共有されます。 ロックする前にテーブルの IS ロックを取得する必要があります。 🎜
  • 🎜意図的な排他ロック (IX): 上記と同様、トランザクションが共有されていることを示します。データ行に排他ロックを追加する準備をしています。トランザクションが開始されていることを示します。 データ行に排他ロックを追加する前に、まずテーブルの IX ロックを取得する必要があります。 🎜
🎜 インテンション ロックは InnoDB によって自動的に追加され、ユーザーの介入は必要ありません。 🎜🎜 INSERTUPDATE、および DELETE の場合、InnoDB は一般的な SELECT に関連するデータに排他ロックを自動的に追加します。 > code> ステートメントを使用すると、InnoDB はロックを追加しません。トランザクションは次のステートメントを通じて共有ロックまたは排他ロックを明示的に追加できます。 🎜🎜共有ロック: SELECT ... LOCK IN SHARE MODE;🎜🎜排他ロック: SELECT ... FOR UPDATE;🎜

以上がMySQL の共有ロックと排他ロックの使用法を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。