ホームページ データベース mysql チュートリアル MySQL トランザクション、ロック、アプリケーション (2)

MySQL トランザクション、ロック、アプリケーション (2)

Feb 06, 2017 am 10:40 AM

InnoDB はトランザクション、行ロック、テーブル ロックをサポートします。MyISAM はトランザクションをサポートせず、テーブル ロックのみをサポートします。ここでは InnoDB のみを紹介します。

InnoDB は、次の 2 種類の行ロックを実装します。

  • 共有ロック(S): 1 つのトランザクションが行を読み取ることを許可し、他のトランザクションが同じデータ セットの排他ロックを取得できないようにします。

  • 排他ロック (X): 排他ロックを取得するトランザクションがデータを更新できるようにし、他のトランザクションが同じデータ セットに対して共有読み取りロックと排他書き込みロックを取得できないようにします。

さらに、行ロックとテーブル ロックを共存させ、複数粒度のロック メカニズムを実装できるようにするために、InnoDB には内部的に使用される 2 つのインテンション ロック (インテンション ロック) もあり、どちらもテーブル ロックです。

  • 意図共有ロック (IS): トランザクションは、データ行に行共有ロックを追加することを目的としており、データ行に共有ロックを追加する前に、まずテーブルの IS ロックを取得する必要があります。

  • 意図排他ロック (IX): トランザクションは、データ行に行排他ロックを追加することを目的としており、データ行に排他ロックを追加する前に、まずテーブルの IX ロックを取得する必要があります。 InnoDB 行ロック モード互換性リスト

    S
IS

Xロックモードが要求された場合トランザクションによる現在のロック、InnoDB との互換性要求されたロックをトランザクションに許可します。そうでない場合、この 2 つに互換性がない場合、トランザクションはロックが解放されるまで待機します。 注: インテンション ロックは InnoDB によって自動的に追加され、ユーザーの介入は必要ありません。 UPDATE、DELETE、INSERT ステートメントの場合、InnoDB は関連するデータ セットに排他ロック (X) を自動的に追加します。 通常の SELECT ステートメントの場合、InnoDB はロックを追加しません。 InnoDB の行ロックは、インデックス上のインデックス項目をロックすることによって実装されます。したがって、InnoDB の行ロック実装機能は、InnoDB がインデックス条件を通じてデータを取得するためにのみ行レベルのロックを使用することを意味します。それ以外の場合は、InnoDB がテーブル ロックを使用します。 。 さらに、トランザクションは、次のステートメントを使用して、レコードセットに共有ロックまたは排他ロックを明示的に追加できます。
conflict

conflict

conflict

conflict

IX
conflict 互換 競合 互換性のある
S 競合 競合 互換性あり 互換性あり
IS 競合 互換性あり 互換性あり 互換性あり

共有ロック: 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) に注目してください。
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

PHPのビッグデータ構造処理スキル PHPのビッグデータ構造処理スキル May 08, 2024 am 10:24 AM

PHPのビッグデータ構造処理スキル

PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? PHP で MySQL クエリのパフォーマンスを最適化するにはどうすればよいですか? Jun 03, 2024 pm 08:11 PM

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

PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? PHP で MySQL のバックアップと復元を使用するにはどうすればよいですか? Jun 03, 2024 pm 12:19 PM

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

PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? PHP を使用して MySQL テーブルにデータを挿入するにはどうすればよいですか? Jun 02, 2024 pm 02:26 PM

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

データベースにおける Java 列挙型のアプリケーション シナリオは何ですか? データベースにおける Java 列挙型のアプリケーション シナリオは何ですか? May 05, 2024 am 09:06 AM

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

MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 MySQL 8.4 で mysql_native_password がロードされていないエラーを修正する方法 Dec 09, 2024 am 11:42 AM

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

PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? PHP で MySQL ストアド プロシージャを使用するにはどうすればよいですか? Jun 02, 2024 pm 02:13 PM

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

PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? PHP を使用して MySQL テーブルを作成するにはどうすればよいですか? Jun 04, 2024 pm 01:57 PM

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

See all articles