MySQL トランザクション、ロック、アプリケーション (2)
Feb 06, 2017 am 10:40 AMInnoDB はトランザクション、行ロック、テーブル ロックをサポートします。MyISAM はトランザクションをサポートせず、テーブル ロックのみをサポートします。ここでは InnoDB のみを紹介します。
InnoDB は、次の 2 種類の行ロックを実装します。
共有ロック(S): 1 つのトランザクションが行を読み取ることを許可し、他のトランザクションが同じデータ セットの排他ロックを取得できないようにします。
排他ロック (X): 排他ロックを取得するトランザクションがデータを更新できるようにし、他のトランザクションが同じデータ セットに対して共有読み取りロックと排他書き込みロックを取得できないようにします。
さらに、行ロックとテーブル ロックを共存させ、複数粒度のロック メカニズムを実装できるようにするために、InnoDB には内部的に使用される 2 つのインテンション ロック (インテンション ロック) もあり、どちらもテーブル ロックです。
意図共有ロック (IS): トランザクションは、データ行に行共有ロックを追加することを目的としており、データ行に共有ロックを追加する前に、まずテーブルの IS ロックを取得する必要があります。
-
意図排他ロック (IX): トランザクションは、データ行に行排他ロックを追加することを目的としており、データ行に排他ロックを追加する前に、まずテーブルの IX ロックを取得する必要があります。 InnoDB 行ロック モード互換性リスト
S
conflictconflictconflictconflict IX | conflict | 互換 | 競合 | 互換性のある |
S | 競合 | 競合 | 互換性あり | 互換性あり |
IS | 競合 | 互換性あり | 互換性あり | 互換性あり |
ロックモードが要求された場合トランザクションによる現在のロック、InnoDB との互換性要求されたロックをトランザクションに許可します。そうでない場合、この 2 つに互換性がない場合、トランザクションはロックが解放されるまで待機します。 | 注: | インテンション ロックは InnoDB によって自動的に追加され、ユーザーの介入は必要ありません。 | ||
通常の SELECT ステートメントの場合、InnoDB はロックを追加しません。 | InnoDB の行ロックは、インデックス上のインデックス項目をロックすることによって実装されます。したがって、InnoDB の行ロック実装機能は、InnoDB がインデックス条件を通じてデータを取得するためにのみ行レベルのロックを使用することを意味します。それ以外の場合は、InnoDB がテーブル ロックを使用します。 。 |
共有ロック: SELECT * FROM table_name WHERE ... 共有モードでロック。
排他ロック (X): SELECT * FROM table_name WHERE ... FOR UPDATE。
- 共有ロックを取得するには SELECT ... IN SHARE MODE を使用します。これは主に、データの依存関係が必要な場合にレコードの特定の行が存在するかどうかを確認し、誰も UPDATE または DELETE を実行しないようにするために使用されます。このレコードに対する操作。ただし、現在のトランザクションでもレコードを更新する必要がある場合は、デッドロックが発生する可能性があります。ロック後に行レコードを更新する必要があるアプリケーションの場合は、SELECT... FOR UPDATE メソッドを使用して排他ロックを取得する必要があります。 。 上記は MySQL トランザクション、ロック、アプリケーション (2) の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか?

PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか?

PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか?

データベースにおける Java 列挙型のアプリケーション シナリオは何ですか?

MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法

PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか?

PHP を使用して MySQL テーブルを作成するにはどうすればよいですか?
