InnoDB がシリアル化分離レベルを実装する方法

InnoDB がシリアル化分離レベルを実装する方法

シリアル化の実装

InnoDB は 2 つの方法でシリアル化を実装します。

まず、SELECT 文が明示的なトランザクション ブロック内にある場合 (表 11-9 のケース番号 1 を実行する場合など)、LOCK_S ロックが適用されます。表 11-6 (レコード ロック トランザクション ロック互換性表) によると、LOCK_S ロックは書き込みロックを除外するため、シリアル化分離レベルでは同時読み取り操作のみが許可され、同時書き込みは禁止され、シリアル化可能性が実現されます。

対応するコードは次のとおりです。

ha_innobase::external_lock(...)

{...

 ロックタイプが F_UNLCK ではない場合

 /* MySQL は新しいテーブルロックを設定しています */

...

 if (trx->isolation_level == TRX_ISO_SERIALIZABLE //シリアル化分離レベル && m_prebuilt->select_lock_type == LOCK_NONE

  && thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)) { // 明示的なトランザクションブロック内 /* シリアル化可能な実行を実現するために、InnoDB は概念的にすべての SELECT に 'LOCK IN SHARE MODE' を追加します

  それ以外の場合は一貫性のある読み取りになります。例外は、AUTOCOMMIT=1 モードでの一貫性のある読み取りです。

  これらは読み取り専用トランザクションであり、一貫性のある読み取りとして実行される場合はシリアル化できることがわかっています。 */

  m_prebuilt->select_lock_type = LOCK_S; //読み取りロックを追加します。つまり、「LOCK IN SHARE MODE」です。

  m_prebuilt->stored_select_lock_type = LOCK_S;

 } // それ以外の場合はロックしません(これも非常に重要です)

...

 } それ以外 {

 TrxInInnoDB::end_stmt(trx);

 DEBUG_SYNC_C("ha_innobase_end_statement");

 }

...}

2 番目の方法は、SELECT ステートメントが明示的なトランザクション ブロック内にない場合に、最新のスナップショット (トランザクションの開始時) を取得してからデータを読み取ることです。このとき、スナップショットベースの一貫性読み取りではロックが不要なため、そのロック状況は表 11-9 の番号 2 に該当する状況になります。

表11-9 シリアル化分離レベルロック

例:

S0: SELECT * FROM bluesea WHERE c1=2; //主キーインデックスをWHERE条件として使用します

さらに、FLUSH...WITH READ LOCK ステートメントの場合、シリアル化分離レベルでは読み取りロック LOCK_S も必要です。

コードは次のとおりです。

ha_innobase::store_lock(

...

 /* FLUSH TABLES をチェックします...読み取りロック付き */

 trx->isolation_level == TRX_ISO_SERIALIZABLEの場合{

  m_prebuilt->select_lock_type = LOCK_S;

  m_prebuilt->stored_select_lock_type = LOCK_S;

 } それ以外 {

  m_prebuilt->select_lock_type = LOCK_NONE;

  m_prebuilt->stored_select_lock_type = LOCK_NONE;

 } 

...

}

シリアル化に関連するのはinnobase_query_caching_of_table_permitted()関数です。シリアル化分離レベルでは、キャッシュされたクエリは許可されません。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に少しでもお役に立てれば幸いです。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただき、ありがとうございます。

以下もご興味があるかもしれません:
  • Innodb トランザクション分離レベルと MySQL のロックの関係に関するチュートリアル
  • InnoDB 分離モードが MySQL のパフォーマンスに与える影響についての簡単な説明

<<:  Vue3.0プロジェクトの構築と利用プロセス

>>:  Ubuntu の Python で C/C++ メソッドを呼び出すダイナミック リンク ライブラリの詳細な説明

推薦する

JavaScript でエラーが発生しやすい演算子操作の概要

目次算術演算子異常状況1: 特殊値リテラルを含む操作異常な状況 2: 他の種類のデータが数学演算に関...

IE環境では、divの高さはフォントの高さよりも大きくなければならないと規定されています。

コードをコピーコードは次のとおりです。 <div class="content&qu...

デザインストーリー: ナンバープレートを覚えられない警備員

<br />私が住んでいる地域では、コミュニティに出入りする車両を管理するために、コミュ...

Dockerイメージのエクスポートとインポート操作

基本イメージが以前に構成されていて、これらのイメージが他の場所でも必要な場合はどうなりますか?回答:...

MySQL 完全折りたたみクエリ正規マッチングの詳細な説明

概要前の章では、クエリのフィルター条件について学習しました。MySQL では、like % ワイルド...

HTMLでは、全体的なスタイルとレイアウトを崩さずに、部分的に強制スクロールバーを使用できます。

まずはエフェクト画像を投稿します:全体的なスタイルとレイアウトが崩れないように、スクロール バーがロ...

Linuxでブーストライブラリをインストールするための完全な手順

序文Boost ライブラリは、標準ライブラリのバックアップとして機能し、C++ 標準化プロセスの開発...

Vue3 Reactivityの実装方法を教えます

目次序文始めるちょっとした考えコードの実装真似する実装トラックトリガーの実装観察の実装計算の実装序文...

Linuxのテキスト処理コマンドsortの詳細な説明

テキストファイルの内容を並べ替える使用方法: ソート + オプション + ファイル名 (複数のファイ...

MySQL で複数のフィールドを連結する詳細な例

MySQL クエリ結果の行フィールドの結合は、次の 2 つの関数を使用して実装できます。 1. co...

MySQL での mysqladmin 日常管理コマンドの概要 (必読)

mysqladmin ツールの使用形式は次のとおりです。 mysqladmin [オプション] コ...

jQuery ツリービュー ツリー構造アプリケーション

この記事では、jQueryツリービューツリー構造のアプリケーションコードを例として紹介します。具体的...

MySQL マスタースレーブレプリケーションでエラーをスキップする方法

1. 従来のbinlogマスタースレーブレプリケーション、エラー報告をスキップする方法 mysql&...

HTML のブロックレベル要素と行レベル要素、特殊文字、ネスト規則

基本的な HTML Web ページ タグのネスト ルールを紹介する場合、最初に説明する必要があるのは...

マウスが画像のハイパーリンク上を通過するときに画像のサイズ(幅、高さ)を変更する CSS

マウスが画像の上を通過したときに画像のハイパーリンクを変更する方法:コードをコピーコードは次のとおり...