MySQL の行レベルのロック、テーブルレベルのロック、ページレベルのロックの中で、行レベルのロックが MySQL で最も詳細なロックであることを紹介しました。行レベルのロックはデータベース操作の競合を大幅に軽減します。 。行レベルのロックは共有ロックと排他ロックに分けられ、共有ロックと排他ロックの概念や使い方、注意点について詳しく紹介します。
読み取りロックとも呼ばれる共有ロックは、読み取り操作によって作成されるロックです。他のユーザーは同時にデータを読み取ることができますが、すべての共有ロックが解放されるまで、トランザクションはデータを変更する (データの排他的ロックを取得する) ことはできません。
トランザクション T
がデータ A
に共有ロックを追加した場合、他のトランザクションは共有ロックを A
にのみ追加でき、排他ロックを追加できません。 。共有ロックが付与されたトランザクションはデータの読み取りのみが可能で、データを変更することはできません。 T
对数据A
加上共享锁后,则其他事务只能对A
再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
用法
SELECT ... LOCK IN SHARE MODE;
在查询语句后面增加LOCK IN SHARE MODE
,MySQL 就会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。
排他锁又称写锁、独占锁,如果事务T
对数据A
加上排他锁后,则其他事务不能再对A
加任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
用法
SELECT ... FOR UPDATE;
在查询语句后面增加FOR UPDATE
,MySQL 就会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。
意向锁是表级锁,其设计目的主要是为了在一个事务中揭示下一行将要被请求锁的类型。InnoDB 中的两个表锁:
意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS
锁;
意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX
锁。
意向锁是 InnoDB 自动加的,不需要用户干预。
对于INSERT
、UPDATE
和DELETE
,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
ロックを取得する必要があります。 🎜IX
ロックを取得する必要があります。 🎜INSERT
、UPDATE
、および DELETE
の場合、InnoDB は一般的な SELECT
に関連するデータに排他ロックを自動的に追加します。 > code> ステートメントを使用すると、InnoDB はロックを追加しません。トランザクションは次のステートメントを通じて共有ロックまたは排他ロックを明示的に追加できます。 🎜🎜共有ロック: SELECT ... LOCK IN SHARE MODE;
🎜🎜排他ロック: SELECT ... FOR UPDATE;
🎜以上がMySQL の共有ロックと排他ロックの使用法を共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。