MySQLトランザクションとSpring分離レベルの実装原理の詳細な説明

MySQLトランザクションとSpring分離レベルの実装原理の詳細な説明

1. トランザクションはACID特性を持つ

  • 原子性: トランザクションは、トランザクションによって分割できない作業の最小単位です。すべてがコミットされるか、すべてが失敗してロールバックされます。
  • 一貫性: データベースは常に、成功したトランザクション コミットの結果のみを含む、一貫性のある状態から別の一貫性のある状態に移行します。
  • 分離: トランザクションによって行われた変更は最後にまとめて送信され、他のトランザクションには表示されません。
  • 耐久性: トランザクションがコミットされると、そのトランザクションによる変更はデータベースに永続的に保存されます。

2. トランザクション分離レベル

1) 分離レベルの定義と問題点

  • READ UNCOMMITTED: トランザクションによって行われた変更は、コミットされていない場合でも、他のトランザクションに表示されます。トランザクションはコミットされていないデータを読み取ることができ、この状況はダーティ リードと呼ばれます。
  • READ COMMITTED: トランザクションはコミットされたデータを読み取ります。これは、ほとんどのデータベースのデフォルトの分離レベルです。トランザクションの実行中に、別のトランザクションによってデータが変更され、このトランザクションの前後で読み取られた情報が異なることになります。この状況は、非反復読み取りと呼ばれます。
  • PEPEATABLE READ (繰り返し読み取り): このレベルは、MySQL のデフォルトの分離レベルです。ダーティ リードの問題を解決し、同じトランザクションによる同じレコードの複数の読み取りの一貫性を保証します。ただし、このレベルでもファントム リードが発生する可能性があります。ファントム リードとは、トランザクション A がデータの範囲を読み取るときに、別のトランザクション B がこの範囲に行を挿入することを意味します。トランザクション A がこの範囲のデータを再度読み取ると、ファントム行が生成されます。特記事項: InnoDB および XtraDB ストレージ エンジンは、マルチバージョン同時実行制御 (MVCC) によってファントム リード問題を解決します。ギャップ ロック (次のキー ロック) を使用して、クエリに関係する行とインデックスのギャップをロックし、ファントム行の挿入を防止します。
  • SERIALIZABLE: このトランザクションは最高の分離レベルであり、トランザクションを強制的にシリアルに実行して、ファントム読み取りの問題を回避します。つまり、SERIALIZABLE は読み取られたデータの各行をロックするため、多くのタイムアウトとロック競合が発生する可能性があります。

分離レベルダーティリードの可能性再現性がない可能性ファントムリードの可能性ロック読み取り
無制限に読むはいはいはいいいえ
レッドコミットいいえはいはいいいえ
繰り返し読み取りいいえいいえはいいいえ
シリアル化可能いいえいいえいいえはい

2) MySQLの変更レベルと分離レベルを見ると

show variables like 'tx_isolation'; # MySQL8 より前の分離レベルを表示しますshow variables like 'transaction_isolation'; # MySQL8 より前の分離レベルを表示します

set global transaction_isolation='READ-COMMITTED'; // 分離レベル、バルブドメイン READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE を設定します

トランザクション分離レベルはセッション レベルに設定できます。セッションごとに異なるレベルを設定できます。

セッショントランザクション分離レベルをコミットされていない読み取りに設定します。
セッショントランザクション分離レベルをコミット読み取りに設定します。
セッショントランザクション分離レベルを繰り返し読み取りに設定します。
セッショントランザクション分離レベルをシリアル化可能に設定します。

3) Springトランザクション分離レベル

Spring トランザクションは、デフォルトでデータベース分離レベルを使用します。@Transactional の isolation パラメータに注釈を付けることで、セッション分離レベルを調整できます。分離レベルはセッション レベルであり、JDBC java.sql.Connection インターフェイスは分離レベルの設定をサポートします。

Spring がトランザクションを開始すると (DataSourceTransactionManager.doBegin)、アノテーション構成に従って接続の分離レベルが設定されます。

MySQLドライバcom.mysql.cj.jdbc.ConnectionImplは、セッションレベルの分離レベルを調整するためにSQL文を実行します。

3. 行き詰まり

デッドロックは、2 つ以上のトランザクションが同じリソースを占有し、お互いが占有しているリソースのロックを要求したときに発生し、悪循環を引き起こします。デッドロックの例:

# トランザクション 1 トランザクションを開始します。
アカウントを更新します。ID=1 のところに money=10 を設定します。
アカウントを更新します。ID=2 のところに money=20 を設定します。
専念;

# トランザクション 2 トランザクションを開始します。
アカウントを更新します。ID=2 のところに money=10 を設定します。
アカウントを更新します。ID=1 のところに money=20 を設定します。
専念;

偶然、トランザクション 1 とトランザクション 2 が同時に最初の更新ステートメントの実行を終了し、2 番目の更新ステートメントの実行を準備したところ、レコードが相手側によってロックされていることがわかったとします。すると、2 つのトランザクションは、相手側が要求したロックを保持したまま、相手側がリソースを解放するのを待機することになり、無限ループが発生します。

デッドロックの問題を回避するために、データベースはさまざまなデッドロック検出およびデッドロック長超過メカニズムを実装しています。InnoDB は、行レベルの排他ロックが最も少ないトランザクションをロールバックすることでデッドロックを処理します。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Spring のトランザクション分離レベルの紹介
  • Spring トランザクション分離レベルの紹介と例の分析
  • Spring トランザクション伝播プロパティと分離レベルの詳細な紹介
  • Spring トランザクション分離レベル、伝播メカニズム、および簡単な構成方法
  • Java Springトランザクションの分離レベルの詳細な説明

<<:  Xftp のダウンロードとインストールのチュートリアル (グラフィック チュートリアル)

>>:  Vueは下部のポップアップウィンドウで複数選択を実装します

推薦する

MySQLのSeconds_Behind_Masterの詳細な説明

目次マスターの後ろの秒数オリジナルの実装最終マスタータイムスタンプマスターとのクロック差他の実行時間...

ウェブページを作成する際に注意すべき点

--ホームページのバックアップ1.txtテキスト2. 画像をスキャンする3. PSDデザイン原画(A...

vue_drf は SMS 認証コードを実装します

目次1. 需要1. 需要2. SDKパラメータ設定1. ディレクトリ構造3. コードの実装1. バッ...

JavaScript プロトタイプの詳細

目次1. 概要1.1 プロトタイプとは何ですか? 1.2 プロトタイプを入手する2. プロトタイプの...

MySQL 8.0.17 のインストールと設定のグラフィックチュートリアル

この記事は、参考のためにMySQL 8.0.17のインストールと設定のグラフィックチュートリアルを記...

Redhat 8.0 システムのインストール方法に関するグラフィック チュートリアル (初心者には必須)

目次1. はじめに2. インストール01. 新しい仮想マシンを作成する02. システムをインストール...

MySql データベースのサブクエリと高度なアプリケーションの簡単な分析

MySql データベースのサブクエリ:サブクエリ: 選択クエリ ステートメント内に別の選択ステートメ...

HTML のインラインブロックの空白を素早く削除する 5 つの方法

inline-block プロパティ値は、「インライン」要素のマージンとパディングを制御する必要があ...

Linux のスケジュールタスク Crontab コマンドの使用に関する詳細な説明と概要

crontab コマンドは、Unix および Linux で定期的な実行命令を設定するために使用され...

Docker が MySQL イメージをプルするのが遅すぎる問題を解決する

Docker を使用して MySQL イメージをプルしようとして 30 分経っても失敗したため、代わ...

Navicat の MySQL へのリモート接続の実装手順の分析

序文皆さんはリモート サーバーで開発を行っており、MySQL の使用率はかなり高いはずです。コマンド...

CentOS7 で MySQL 5.7.24 をコンパイルしてインストールする詳細なチュートリアル

目次依存関係をインストールするブーストをインストールMySQLをコンパイルしてインストールする構成依...

Nginx で何ができるかの包括的な分析

序文この記事は、サードパーティのモジュールをロードせずにNginxで処理できることのみに焦点を当てて...

Win10 DVWA のダウンロード、インストール、構成のグラフィック チュートリアルの詳細な説明 (初心者向け学習侵入)

コンピュータ システムが再インストールされ、侵入テスト学習環境 DVWA を再インストールする必要が...

React.FCとReact.Componentの使用に関する簡単な説明

目次1. React.FC<> 2. クラスxxはReact.Componentを拡張し...