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は下部のポップアップウィンドウで複数選択を実装します

推薦する

デザイン理論: なぜ私たちは間違った場所を見ているのでしょうか?

数日前、バスで仕事に行きました。バスのカードリーダーの実際の使用シーンを実際に見て、カードリーダーの...

Windows に Docker と docker-compose スイートをインストールするための詳細なチュートリアル

目次導入ダウンロードしてインストールする設定docker-composeをインストールする導入Doc...

Node.js でメモリ効率の高いアプリケーションを作成する方法

目次序文問題: 大きなファイルのコピーNodeJS のストリームとバッファバッファストリーム解決策 ...

docker を使用して Django テクノロジー スタック プロジェクトをデプロイする方法

Docker の人気と成熟に伴い、Docker は徐々にプロジェクトをデプロイするための第一の選択肢...

ゲーム開発におけるサウンド処理にCocosCreatorを使用する方法

目次1. Cocos Creatorでのオーディオ再生の基本1. 基本2. 一般的な方法2. Coc...

Ubuntu 20.04の新バージョンでルートユーザーを使用してシステムにログインする方法の詳細なチュートリアル

Ubuntu 20.04 では、デフォルトで root ログインが有効になっていないため、デスクトッ...

img 画像タグに alt 属性を付与する必要がありますか?

img 画像タグに alt 属性を追加しますか?画像 img タグの alt 属性を見落とすことはよ...

MySQL の接続数が多すぎるエラーの原因と解決策

目次概要本日正午、開発およびテスト環境の MySQL サービスで接続数が多すぎるというエラーが報告さ...

MySQL でのログインを取り消す

コンセプト紹介: MySQL の redo ログにはトランザクションの動作が記録されることはご存じの...

このリファレンスとJavaScriptのカスタムプロパティの詳細な説明

目次1. このキーワード2. カスタム属性3. 包括的なケース1:タブの実装付録要約する1. このキ...

EclipseのプロジェクトをTomcatに追加できない問題を解決する方法

1. プロジェクトを右クリックしてプロパティを選択します2. プロジェクトファセットをクリック3. ...

JavaScript はパスワードボックスの入力検証を実装します

サーバーの負荷を軽減するために、ユーザーが入力するときにフロントエンドページで簡単な検証を実行する必...

MySQL 文字列分割操作 (区切り文字を含む文字列のインターセプション)

区切り文字なしの文字列抽出質問の要件データベース内のフィールド値:実装効果: 1行のデータを複数行に...

vue+elementUI で埋め込みテーブルを実装する方法の例

大学 4 年生のときのインターンシップ中に、表内のデータの番号をクリックすると、そのデータの下に新し...

WeChatアプレットのスケルトン画面の実装例

目次スケルトンスクリーンとはアプレットでスケルトン画面を生成する方法導入方法表示と非表示ユーザーエク...