MySQLのトランザクション特性とレベル原則の分析

MySQLのトランザクション特性とレベル原則の分析

1. トランザクションとは何ですか?

データベース トランザクション (略称: トランザクション) は、データベース管理システムの実行プロセスにおける論理単位であり、有限の一連のデータベース操作で構成されます。

2. 取引の4つの主要な属性

これらは、原子性、一貫性、独立性、および永続性です。

1. 原子性

アトミック性とは、トランザクションに含まれるすべての操作が成功するか、失敗してロールバックされるかのいずれかであることを意味します。したがって、トランザクション操作が成功した場合、その操作はデータベースに完全に適用される必要があります。操作が失敗した場合、データベースに影響を及ぼすことはできません。

2. 一貫性

一貫性とは、トランザクションがデータベースをある一貫した状態から別の一貫した状態に変換する必要があることを意味します。つまり、トランザクションは実行前と実行後に一貫した状態である必要があります。たとえば、ユーザー A とユーザー B の合計金額が 1000 であるとします。A と B がどのように、何回送金したとしても、取引が完了した後、2 人のユーザーの合計金額は 1000 のままである必要があります。これが取引の一貫性です。

3. 孤立

分離とは、複数のユーザーが同時に同じテーブルを操作するなど、データベースに同時にアクセスする場合に、各ユーザーに対してデータベースが開いたトランザクションが他のトランザクションの操作によって干渉されることがなく、複数の同時トランザクションが互いに分離されている必要があることを意味します。トランザクションの分離に関しては、データベースは複数の分離レベルを提供しますが、これについては後で紹介します。

4. 耐久性

永続性とは、トランザクションがコミットされると、データベース内のデータへの変更が永続的になり、データベース システムに障害が発生してもトランザクションのコミット操作が失われないことを意味します。たとえば、JDBC を使用してデータベースを操作する場合、トランザクション メソッドを送信した後、トランザクション操作が完了したことをユーザーに通知します。プログラムを実行してプロンプトが表示されたら、トランザクションが正しく送信されたことがわかります。この時点でデータベースに問題があったとしても、トランザクションを完全に実行する必要があります。そうしないと、トランザクションが完了したというプロンプトは表示されますが、データベースが障害のためにトランザクションを実行できないという重大なエラーが発生します。これは許可されません。

3. MySQL分離レベル

コミットされていない読み取り

コミットされていない読み取りトランザクション レベルでは、トランザクションは別のトランザクションによってコミットされていないデータを読み取ることができます。
たとえば、トランザクション A はフィールドを更新しましたが、コミットされていません。トランザクション B では、ID 1000 のレコードの name フィールドを読み取るときに、name の値は 'aaa' ですが、トランザクション A はコミットされていないため、name = 'aaa' がロールバックされる可能性があります。この場合、トランザクション A はコミットされていないトランザクションのデータを読み取ります。これはダーティ リードと呼ばれます。

コミットされた読み取り

コミットされた読み取りトランザクション レベルでは、トランザクションは別のトランザクションがコミットされた後にデータを読み取ることができます。

例えば、トランザクション A が id 1000 のレコードの name フィールドを aaa として読み取り、その後トランザクション B がこのレコードの name 値を更新してコミットします。トランザクション A が再度 name を読み取ると、name の値は bbb になります。そのため、トランザクションでは、フィールドが複数回読み取られると、取得される値が異なる場合があります。

トランザクション A の前後で 2 回読み取られた値が矛盾しています。

繰り返し読み取り

繰り返し読み取りトランザクション レベルでは、トランザクションが繰り返し読み取るフィールドは変更されません。

たとえば、トランザクション A が ID 1000 で名前の値が aaa であるレコードを読み取り、その後トランザクション B が名前を bbb に変更し、トランザクション B がコミットされます。トランザクション A が名前を再度読み取ると、bbb は読み取られません。したがって、トランザクション A は独立した世界にあるのと同じであり、外部からの変更はトランザクション A に影響を与えません。

ただし、繰り返し読み取りはファントム読み取りにつながる可能性があります。ファントム読み取りとは何でしょうか? 例:
トランザクション A がテーブルをクエリします。テーブルには ID 1 のレコードが 1 つだけあります。ただし、トランザクション B は ID 2 のレコードを挿入します。トランザクション A は ID 2 のデータがあることを知らないため、ID 2 のレコードも挿入します。これは確実に失敗します。この状況はファントム リードと呼ばれます。

注: MYSQL の InnoDB は、MVCC (Multi-version Concurrency Control) を通じてファントム リード (幻影読み取り) を解決します。また、MYSQL のデフォルトのトランザクション レベルは繰り返し読み取りであり、Oracle および SQL Server のデフォルトの分離レベルは読み取りコミットです。

シリアル化可能

シリアル化可能なトランザクションレベルで、読み取られたデータの各行をロックします。

ロックの利点は、ダーティ リードやファントム リードを回避し、非反復読み取りの可能性も回避できることです。ただし、ロックにより、同時にロックを取得できるスレッドは 1 つだけになるため、同時実行性が大幅に低下します。また、タイムアウトの問題も多数発生する可能性があります。

概要: 非反復読み取りとファントム読み取りは混同されやすいです。非反復読み取りは変更に重点を置いていますが、ファントム読み取りは追加または削除に重点を置いています。非反復読み取りの問題を解決するには、条件を満たす行のみをロックする必要があります。ファントム読み取りの問題を解決するには、テーブルをロックする必要があります。

分離レベル:

分離レベルダーティリード非反復読み取りファントムリード
コミットされていない読み取り可能可能可能
コミットされた読み取り不可能可能可能
繰り返し読み取り不可能不可能可能
シリアル化可能不可能不可能不可能

レベルが高くなるほど、データのセキュリティは高まりますが、パフォーマンスは低下します。

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

以下もご興味があるかもしれません:
  • PHP+MySQL 分散トランザクションとソリューションに関する深い理解
  • MySQL のロックとトランザクションの簡単な分析
  • MySQLトランザクションの特徴と分離レベルについてお話ししましょう
  • MySQL でのトランザクションの使用方法
  • MySQL は ACID トランザクションをどのように実装しますか?
  • MySQL が大規模トランザクションを避けるべき理由とその解決方法
  • MySQL トランザクション分離レベルの原則例分析
  • MySQL トランザクション分離レベルの表示と変更の例

<<:  Docker ファイルの保存パス、コンテナの起動コマンド操作の取得

>>:  ウェブページのコメントにより IE でテキストがオーバーフローする

推薦する

Node.js を使用してパスワード ジェネレータを作成するための完全な手順

目次1. 準備2. コマンドラインの記述2.1 バージョンと説明を追加する2.2 パスワードの長さを...

Win2008 サーバー セキュリティ チェック手順ガイド (日常のメンテナンス手順)

ドキュメントはしばらく前から書いていましたが、アップロードする勇気がありませんでした。サーバーのセキ...

js 配列エントリ() 反復メソッドを取得する

目次1.entires() メソッドの詳細な構文2.entires() メソッドの一般的な使用法と注...

ウェブデザイン実践者必読のキャリアプラン

原文記事、転載の際は著者と出典を明記してください! Web デザインは間違いなくテクノロジーであり、...

Centos7のシステム言語を簡体字中国語に変更する方法

例示するシステムを自分でインストールする場合は、通常、システム言語をカスタマイズできます。ただし、ク...

MySQLクエリ条件の一般的な使用法の詳細な説明

この記事では、例を使用して、MySQL クエリ条件の一般的な使用方法を説明します。ご参考までに、詳細...

MySQLウィンドウ関数の具体的な使用法

目次1. ウィンドウ関数とは何ですか? 1. ウィンドウをどのように理解しますか? 2. ウィンドウ...

MySQL のグループ分けの例

mysql のような php switch case ステートメント。 xxフィールドを選択、ケース...

IIS7 IIS8 http は自動的に HTTPS にジャンプします (ポート 80 はポート 443 にジャンプします)

IIS7 では、「URL REWRITE2」疑似静的モジュールがインストールされているかどうかを確...

非表示のフォームテキストを表示するJavaScript

この記事では、フォームの隠しテキストを表示するためのJavaScriptの具体的なコードを参考までに...

フローティングをクリアするいくつかの方法(推奨)

1. 同じタイプの空の要素を追加し、要素の CSS 属性 clear:both; を設定します。 ...

JavaScript Domはカルーセルの原理と例を実装します

カルーセルを作りたい場合、まずその原理を理解する必要があります。画像を右から左にスライドさせるにはど...

フォント宝庫 50 種類の素晴らしい無料英語フォントリソース パート 2

デザイナーは独自のフォント ライブラリを持っているため、プロジェクトの設計時にすぐに使用できます。今...

Linux リモート管理と sshd サービス検証の知識ポイントの詳細な説明

1. SSHリモート管理SSH の定義SSH (Secure Shell) は、主にキャラクタ イン...

Vueはメニューナビゲーションを実装するためにelement-uiを使用します

この記事では、Element-uiを使用してメニューナビゲーションを実装するVueの具体的なコードを...