MySQL データベース トランザクション例のチュートリアル

MySQL データベース トランザクション例のチュートリアル

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

ここに画像の説明を挿入

トランザクションは完全なビジネス ロジック ユニットであり、分割することはできません。
たとえば、銀行口座の口座 A から口座 B に 10,000 元を送金するには、次の 2 つの更新ステートメントを実行する必要があります。

t_act を更新し、balance=balance-10000 として actno='act-001' に設定します。
t_act を更新し、balance=balance+10000 に設定します。ただし、actno='act-0021' です。

上記の 2 つの DML ステートメントは、同時に成功するか、同時に失敗する必要があります。一方が成功し、もう一方が失敗することは許可されません。
上記の 2 つの DML ステートメントが同時に成功または失敗することを保証するには、データベースの「トランザクション メカニズム」を使用する必要があります。

2. トランザクションに関連するステートメントは、挿入、削除、更新の3つのDMLステートメントのみです。

「なぜ DML ステートメントは挿入、削除、更新の 3 つだけなのですか?」
これら 3 つのステートメントはすべて、データベース テーブル内の「データに関連する」ためです。トランザクションは、データの整合性とセキュリティを確保するために存在します。

3. すべてのビジネス操作を 1 つの DML ステートメントを使用して処理できると仮定した場合、トランザクション メカニズムは依然として必要ですか?

取引は必要ありません。
しかし、実際の状況はそうではありません。通常、1 つの事柄 (「トランザクション」) を完了するには、複数の DML ステートメントを同時に実行する必要があります。

4. 取引の原則

ここに画像の説明を挿入

知らせ:
トランザクションがコミットされると、履歴操作がハードディスクに永続化されます。永続化が完了すると、履歴レコードはクリアされます。
トランザクションがロールバックされると、履歴レコードはハードディスクに保存されずに直接クリアされます。
トランザクション操作ではセーブポイントを設計することもできます。理解してください。

5. トランザクションの4つの特性: ACID

ここに画像の説明を挿入

トランザクションには4つの主要な特性がある:ACID
原子性: トランザクションは作業の最小単位であり、分割できません。
C 一貫性: トランザクションでは、複数の DML ステートメントが同時に成功または失敗することを保証する必要があります。
分離: トランザクション A はトランザクション B から分離されます。
D. 永続性: 永続性とは、トランザクションが正常に完了するためには、最終データがハードディスク ファイルに保存される必要があることを意味します。

以下に、上記のトランザクションの 4 つの主な特性について、さらに詳しく説明します。「原子性」: 一連の操作は成功するか失敗するかのいずれかであり、この一連の操作は分割できません。
「一貫性」: トランザクションが発生する前と発生した後で、データの合計量が一致します。ある人から別の人への送金をシミュレートしてみましょう。送金前は、2人の合計金額は400で、送金後も2人の合計金額は400のままです。
「分離」: すべての操作が完了するまで、他のセッション ウィンドウは中間データの変更を確認できず、現在のウィンドウのみがデータの変更を確認できます。
「永続性」: トランザクションがコミットされると、トランザクションの影響は元に戻すことができず、データは実際に変更されます。

6. トランザクション間の分離

「トランザクション分離には分離レベルがあり、理論的には 4 つの分離レベルがあります」
分離レベルは通常、レベル 2 または 3 から始まり、レベル 1 は一般的に使用されません。

1) 第1レベル: コミットされていない読み取り

相手方のトランザクションはまだ送信されておらず、現在のトランザクションは相手方が送信していないデータを読み取ることができます。
読み取りコミットされていないトランザクションの問題: 「ダーティ リード現象」、つまりダーティ データが読み取られることを意味します。
「ダーティ リード」: データを変更しているが、その変更がデータベースにコミットされていないトランザクションを指します。
別のトランザクションがデータにアクセスすると、そのデータはダーティ データとみなされるため、ダーティ リードと呼ばれます。

2) 第2レベル: コミットされた読み取り

相手側のトランザクションが送信された後にデータを読み取ることができます。
この分離レベルにより、ダーティ リード現象が発生しないという問題が解決されます。
読み取りコミットに関する問題: 繰り返し不可能な読み取り。

3) 第3レベル: 繰り返し読み取り

この分離レベルは、繰り返し不可能な読み取りの問題を解決します。
このレベルでの問題は、読み取られるデータがファンタジー、つまり読み取られるのはバックアップ データであることです。

4) 第4レベル: シリアル化可能な読み取り

すべての問題を解決しました。
ただし、効率は低く、トランザクションをキューに入れる必要があります。

「注目すべきは」
Oracle データベースのデフォルトの分離レベルは、Read Committed (第 2 レベル) です。
mysq1 データベースのデフォルトの分離レベルは、繰り返し読み取り (レベル 3) です。

7. デモトランザクション分離レベル(デモデータを自分で作成する)

1) トランザクションをデモンストレーションする前に習得する必要がある知識ポイント。

1) デフォルトでは、MySQL トランザクションは自動的にコミットされます。
2) 自動コミットとは何ですか?
   DML ステートメントが実行されるたびに、自動的に 1 回送信されます。
   したがって、トランザクションをデモンストレーションする前に、まず自動コミットをオフにする必要があります。
   「自動コミットステートメントをオフにする」:トランザクションを開始します。    
3) 「トランザクションを示すために知っておく必要がある 3 つのコマンド:」
   -- 自動トランザクションコミット機能をオフにします。
   トランザクションを開始します。
  -- トランザクションをコミットします。
  専念;
  -- トランザクションをロールバックします。最後のコミット ポイントまでのみロールバックします。
  ロールバック;   

2) グローバルトランザクション分離レベルを設定します。

「グローバルトランザクション分離レベルを設定します。設定後、ログアウトして再度ログインしてください。」
-- 最初のレベルをグローバル トランザクション分離レベル read uncommitted に設定します。
-- 2 番目のレベルのグローバル トランザクション分離レベルを読み取りコミットに設定します。
-- 3 番目のレベルを設定します (システムのデフォルトのトランザクション レベル、設定する必要はありません)
グローバルトランザクション分離レベルを繰り返し読み取りに設定します。
-- 4 番目のレベルのグローバル トランザクション分離レベルを serializable に設定します。

「グローバル トランザクション分離レベルを表示する」
mysql> @@global.tx_isolation を選択します。
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| 繰り返し読み取り |
+-----------------------+
セットに 1 行、警告 1 件 (0.00 秒)

3) コミットされていない読み取りをデモンストレーションします。

まず、グローバル トランザクション分離レベルを設定します。

ここに画像の説明を挿入

以下は正式なデモンストレーションです。

4) デモの読み取りコミット

まず、グローバル トランザクション分離レベルを設定します。

ここに画像の説明を挿入

以下は正式なデモンストレーションです。

ここに画像の説明を挿入

5) 繰り返し読み取りのデモンストレーション

まず、グローバル トランザクション分離レベルを設定します。

ここに画像の説明を挿入

以下は正式なデモンストレーションです。

ここに画像の説明を挿入

これには注意が必要です:

ここで実演されているのは「繰り返し読み取り」です。右のウィンドウでは一連のトランザクション処理を実演しています。左のウィンドウはまったく読み取りできません。左のウィンドウで読み取られるのは、常に元のデータのバックアップ データです。

どのように理解しますか?

左ウィンドウのトランザクション機能もオンになっていることを忘れないでください。トランザクションを開始します。左ウィンドウのトランザクション機能が終了しない限り(コミットまたはロールバックでトランザクションを終了できます)、左ウィンドウによって読み取られるデータは常に元のデータのバックアップ データです。これが「ファンタジー」と呼ばれるものです。右側の黒いウィンドウでどのような変更を加えても、トランザクションをコミットしても、左側のウィンドウには表示されません。

左側に黒いウィンドウがあります。この変更を確認するにはどうすればよいでしょうか? 「

左側の黒いウィンドウのみ、まず現在の黒いウィンドウのトランザクションを終了し、再度読み取ると、実際にデータが変更になったことがわかります。

6) 連続した読み方を実演する

まず、グローバル トランザクション分離レベルを設定します。

ここに画像の説明を挿入

以下は正式なデモンストレーションです。
最初の写真:

ここに画像の説明を挿入

「commit」コマンドを使用して左側のウィンドウでトランザクションがコミットされると、右側のウィンドウで変更を確認できます。

ここに画像の説明を挿入

上記は、MySQL データベース トランザクション例チュートリアルの詳細な内容です。MySQL データベース トランザクションの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL XA で分散トランザクションを実装する方法
  • MySQLクエリトランザクション処理へのノード接続の実装
  • MySQL と Golan 間の従来の分散トランザクションのための 7 つのソリューション
  • MySQLトランザクションが効率に与える影響の分析と概要
  • MySQL トランザクション分離レベルの詳細
  • MySQLデータベースのトランザクションとインデックスの詳細な説明
  • MySQL トランザクション分析

<<:  Dreamweaver8を使用してウェブサイトのファイルをチェックして整理する方法

>>:  入力ファイルの制御と美化について

推薦する

MyBatisインターセプターのページング機能を実装する方法

MyBatisインターセプターのページング機能を実装する方法序文:まず、実装原則についてお話しします...

一般的なSQL削除ステートメントの原則の違いを理解するだけです

この記事では主に、SQL 削除ステートメント DROP、TRUNCATE、および DELETE の違...

フロントエンドの vue+express ファイルのアップロードとダウンロードの例

新しいserver.jsを作成する糸初期化 -y 糸を追加エクスプレスノードモン -D var ex...

MySQLの通常インデックスとユニークインデックスの違いの詳しい説明

目次1 概念上の区別2 事例紹介3 クエリパフォーマンス4 アップデートのパフォーマンス4.1 記憶...

Dockerボリューム権限管理の詳細な説明

ボリュームデータボリュームは Docker の重要な概念です。データ ボリュームは、1 つ以上のコン...

LeetCode の SQL 実装 (183. 注文をしたことがない顧客)

[LeetCode] 183.注文しない顧客Web サイトに、Customers テーブルと Or...

初心者のためのWebサイト構築入門 ③ エイリアス(CNAME)レコードとURL転送

①. エイリアス(CNAME)レコードの使用方法:前回の投稿のドメイン名解決では、A レコードの解...

jQueryはマウスドラッグ画像機能を実装します

この例では、jQuery を使用してマウス ドラッグ イメージ機能を実装します。まず、ラッパーを設定...

MySQL マルチマスターと 1 スレーブのデータバックアップ方法のチュートリアル

概要いずれかのデータベースに対する操作は他のデータベースに自動的に適用され、2 つのデータベースのデ...

hr 水平線スタイルの例コード

コードをコピーコードは次のとおりです。 <hr style="width:490px...

MySQLとOracleの誤解の詳細な説明

目次本質的な違いデータベースセキュリティ権限スキーマの移行パターンオブジェクトの類似性スキーマオブジ...

Nginx proxy_redirect の使用方法の詳細な説明

今日、Apache の nginx リバース プロキシを実行していたときに、ちょっとした問題に遭遇し...

VUE ユニアプリコア知識の簡単な紹介

目次仕様a. ページファイルはVueの単一ファイルコンポーネント仕様に準拠しています。 b. コンポ...

この記事ではJavaScriptのガベージコレクションの仕組みを説明します

目次1. 概要2. メモリ管理3. ガベージコレクション4. GCアルゴリズムの紹介5. 参照カウン...

Vue で棒グラフを使用し、自分で設定を変更する方法

1. HTMLファイルでechartをインポートする <!-- echarts をインポート ...