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を使用してウェブサイトのファイルをチェックして整理する方法

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

推薦する

インスピレーションを得るための7つのクールなダイナミックウェブサイトデザイン

デザインの分野では、毎年さまざまなデザインのトレンドや流行があります。たとえば、近年のレスポンシブデ...

HTML タグ マーキーはさまざまなスクロール効果を実現します (JS 制御なし)

ページの自動スクロール効果は JavaScript で実現できますが、今日偶然、JS 制御なしでさま...

jsはカスタムドロップダウンボックスを実装します

この記事の例では、カスタムドロップダウンボックスを実装するためのjsの具体的なコードを参考までに共有...

Html+CSS フローティング広告ストリップの実装

1.html部分コードをコピーコードは次のとおりです。 <!DOCTYPE html> ...

Echatsチャートの大画面適応を実装する方法

目次説明する成し遂げるプロジェクトのディレクトリ構造は次のとおりです。効果図は以下のとおりです要約す...

MySQL 空間データストレージと関数

目次1. データ型1. MySQL空間データとは何か2. GeoJSONとは3. 空間データ型のフォ...

Docker で複数の MySQL コンテナを作成して実行する方法の例

1. mysql/mysql-server:latestイメージを使用してMySQLインスタンスを素...

Linux でユーザーを完全に削除する 2 つの方法

Linux 操作実験環境: Centos7 仮想マシンまず、共通ユーザーgubeiqingを作成しま...

JavaScriptでフロアナビゲーションエフェクトを作成するプロセスの詳細な説明

目次この期間の目標1. 関数の実装1.1 構造層1.2 スタイルレイヤー1.3 行動層1.3.1 フ...

Meituan DBデータをデータウェアハウスに同期するアーキテクチャと実践

背景データ ウェアハウス モデリングでは、何ら処理されていない元のビジネス レイヤー データは OD...

MySQL はカスタムシーケンスを使用して row_number 関数を実装します (詳細な手順)

いくつかの記事を読んだ後、ようやく MySQL で row_number() ソートを実装する方法が...

Node.js ファイルのコピー、フォルダの作成、その他の関連操作

NodeJS は次のファイルをコピーします:通常、小さなファイルのコピー操作では、ストリーム パイプ...

MySQLワームレプリケーションの基本知識

ワームは、その名前が示すように、自ら複製し、その数は倍増、つまり指数関数的に増加します。 MySQL...

ハイパーリンクAタグを学ぶ

聞く: CSS を使用してハイパーリンクのスタイルを設定しましたが、ホバーしても機能しません。なぜこ...

Ajax responseText による JSON データの解析のケース スタディ

ajax 処理後にサーバーから返される responseText が JSON データであるという問...