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サービスを開くおよび閉じる2つの方法

方法1: cmdコマンドを使用するまず、DOS ウィンドウを開き、スタート、実行、cmd と入力しま...

Linux での MySQL マルチインスタンスの展開とインストール ガイド

MySQLマルチインスタンスとは簡単に言うと、MySQL マルチインスタンスとは、サーバー上で複数の...

CSS 配送先住所平行四辺形線スタイルの例コード

コードは次のようになります。 // 配送先住所の平行四辺形の線のスタイル <view clas...

Linux システムのシャットダウンコマンドの違いと使い方の詳細な説明

Linux システムのシャットダウン コマンドは何ですか? Liangxu Tutorial Net...

Vue で $props、$attrs、$listeners を使用する方法の詳細な説明

目次背景1. 文書の説明2. 特定の用途結論背景ここで、状況について説明しましょう。親コンポーネント...

Linux ファイル管理コマンド例の分析 [表示、閲覧、統計など]

この記事では、Linux ファイル管理コマンドについて例を挙げて説明します。ご参考までに、詳細は以下...

垂直グリッドと漸進的な行間隔の例

新しい質問急いで来て、急いで行ってください。 「垂直グリッドとプログレッシブ行間隔 (パート 1)」...

Dockerはコンテナに入るためにnsenterツールを使用する

Dockerコンテナを使用する場合は、nsenterツールを使用する方が便利です。システムにない場合...

MySQLでMyISAMストレージエンジンをInnodbに変更した操作記録のまとめ

一般的に、MySQL はデフォルトでさまざまなストレージ エンジンを提供しており、次のように表示され...

Windows Server 2008R2 ファイル サーバーを Windows Server 2016 にアップグレードする

ユーザー組織には、ドメインに参加している 2 台の Windows Server 2008 R2 フ...

MySQLデュアルマスター(マスターマスター)アーキテクチャ構成ソリューション

企業では、データベースの高可用性は常に最優先事項です。多くの中小企業は、MySQL マスター スレー...

モバイルの赤い封筒の雨機能ページを実装するための JavaScript HTML

この記事の例では、モバイル紅包雨機能ページを実現するためのHTMLの具体的なコードを共有しています。...

ソースコードから、Vue2がデータとメソッドを直接取得できる理由がわかる

目次1. 例: これはデータとメソッドを直接取得できます2. 環境を準備し、ソースコードをデバッグし...

製品を選択した後、右下隅に√記号を表示するための純粋なCSS

おすすめの記事: CSS 疑似クラスの右下隅をクリックすると、選択を示すチェックマークが表示されます...

Nginx キャッシュ ファイルと動的ファイルの自動バランス設定スクリプト

nginx Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバー...