MySQLトランザクションを実行するための構文とプロセスの詳細な説明

MySQLトランザクションを実行するための構文とプロセスの詳細な説明

概要: MySQL は、トランザクションをサポートするためにさまざまなストレージ エンジンを提供します。

MySQL は、トランザクションをサポートするためにさまざまなストレージ エンジンを提供します。トランザクションをサポートするストレージ エンジンは InnoDB と BDB です。InnoDB ストレージ エンジンのトランザクションは主に UNDO ログと REDO ログを通じて実装されますが、MyISAM ストレージ エンジンはトランザクションをサポートしていません。

拡張: どのデータベースにも、データベースの動作ステータス、日常的な操作、エラー メッセージなどを記録するさまざまなログがあります。MySQL も例外ではありません。たとえば、ユーザー root が MySQL サーバーにログインすると、ユーザーのログイン時間、実行操作などがログ ファイルに記録されます。

MySQL サーバーを保守するために、MySQL データベースでログ操作を実行する必要があることがよくあります。

UNDO ログ: トランザクションが実行される前にデータをコピーし、トランザクションで例外が発生したときにデータをロールバックするために使用されます。 REDO ログ: トランザクション実行中にデータを更新する各操作を記録します。トランザクションがコミットされると、その内容がディスクにフラッシュされます。

デフォルトでは、各 SQL ステートメントはトランザクションです。つまり、SQL ステートメントの実行後に自動的にコミットされます。複数の操作をまとめて処理するという目的を達成するには、BEGIN または START TRANSACTION を使用してトランザクションを開始するか、現在のセッションの自動送信を無効にする必要があります。

トランザクション実行の構文とフロー

SQL はトランザクションを管理するために次のステートメントを使用します。

1) 取引を開始する

始める;

または

トランザクションを開始します。

このステートメントは、トランザクションの開始点を明示的にマークします。

2) トランザクションをコミットする

MySQL はトランザクションをコミットするために次のステートメントを使用します。

専念;

COMMIT はトランザクションをコミットすること、つまりトランザクションのすべての操作をコミットすることを意味します。具体的には、トランザクション内のデータベースへのすべての更新がディスク上の物理データベースに書き込まれ、トランザクションが正常に終了します。

トランザクションをコミットするということは、トランザクションの開始以降に実行されたすべてのデータが変更され、データベースの永続的な一部となり、トランザクションの終了を示すことを意味します。このコマンドを実行すると、トランザクションをロールバックすることはできません。この操作は、すべての変更をデータベースにコミットする準備が整った場合にのみ実行されます。

3) トランザクションをロールバック(元に戻す)する

MySQL は次のステートメントを使用してトランザクションをロールバックします。

ロールバック;

ROLLBACK はトランザクションをキャンセルすることを意味します。つまり、トランザクションの実行中に何らかの障害が発生し、トランザクションを続行できなくなった場合、システムはトランザクション内のデータベースで完了したすべての操作をキャンセルし、トランザクションの開始時の状態にロールバックします。ここでの操作は、データベースに対する更新操作を指します。

トランザクションの実行中にエラーが発生した場合は、ROLLBACK ステートメントを使用して、トランザクションを開始点または指定された保留点までロールバックします。同時に、システムはトランザクションの開始以降または特定のセーブポイントまでのすべてのデータ変更をクリアし、トランザクションによって制御されるリソースを解放します。したがって、このステートメントはトランザクションの終了も示します。

要約する

BEGIN または START TRANSACTION ステートメントに続く、データベース データを更新する SQL ステートメントは、ROLLBACK ステートメントまたは COMMIT ステートメントが検出されるまでトランザクション ログに記録されます。トランザクション内の操作が失敗し、ROLLBACK ステートメントが実行されると、トランザクション ステートメントが開かれた後に更新されたすべてのデータは、トランザクションが開始される前の状態にロールバックされます。トランザクション内のすべての操作が正しく完了し、COMMIT ステートメントを使用して更新されたデータをデータベースに送信すると、データは新しい一貫した状態になります。

デモ例

次の 2 つの例は、MySQL トランザクションの具体的な使用方法を示しています。

次のシミュレーションは、張三の口座残高が 500 元減少した後、李思の口座残高がまだ 500 元増加していないため、他のセッションがデータ テーブルにアクセスしていることを示しています。コードは 2 つのウィンドウで実行する必要があるため、読みやすくするために、それらをウィンドウ A とウィンドウ B と呼びます。

ウィンドウ A でトランザクションを開き、mybank データベースの bank テーブルのデータを更新します。SQL ステートメントと実行結果は次のとおりです。

B ウィンドウで、銀行データ テーブル内のデータを照会します。SQL ステートメントと実行結果は次のとおりです。

結果から、ウィンドウ A のトランザクションによって銀行テーブルのデータが変更済みであるにもかかわらず、データがすぐに更新されていないことがわかります。この時点では、他のセッションは更新前のデータをまだ読み取っています。

ウィンドウ A でトランザクションの実行を継続し、トランザクションをコミットします。SQL ステートメントと実行結果は次のとおりです。

ウィンドウ B で、銀行テーブルのデータを再度クエリします。SQL ステートメントと実行結果は次のとおりです。

ウィンドウ A で COMMIT を実行してトランザクションをコミットすると、データに加えられた更新がまとめてコミットされ、他のセッションは更新されたデータを読み取ります。結果から、張三と李思の合計口座残高は振替前の残高と一致しており、データが 1 つの一貫した状態から別の一貫した状態に更新されていることがわかります。

前述のように、トランザクションの実行中に問題が発生した場合、つまり、通常のプロセスに従って完全なトランザクションを実行できない場合は、ROLLBACK ステートメントを使用してデータをロールバックし、初期状態に復元できます。

例 1 では、張三の口座残高は 500 元に減っています。さらに 1,000 元を送金すると残高がマイナスになるため、元の状態に戻す必要があります。例2に示すように。

Zhang San の口座残高を 1,000 元減らし、トランザクションをロールバックします。SQL ステートメントと実行結果は次のとおりです。

結果から、トランザクションのロールバックを実行した後、アカウント データが初期状態、つまりトランザクションが実行される前の状態に復元されていることがわかります。

拡大する

データベース操作では、同時データ読み取りの正確性を効果的に保証するために、トランザクション分離レベルが提案されています。例 1 および 2 のデモンストレーションでは、トランザクション分離レベルはデフォルトの分離レベルです。 MySQL では、デフォルトのトランザクション分離レベルは REPEATABLE-READ です。つまり、トランザクションが完了していない場合 (COMMIT または ROLLBACK が実行されていない場合)、他のセッションはコミットされていないデータのみを読み取ることができます。

予防

MySQL トランザクションは非常にリソースを消費する機能です。使用時には以下の点に注意してください。

1) 取引をできるだけ短くする

トランザクションの開始から終了まで、トランザクションの原子性、一貫性、分離性、および永続性を確保するために、データベース管理システムに大量のリソースが予約されます。マルチユーザー システムの場合、大規模なトランザクションは大量のシステム リソースを占有し、システムに過負荷をかけ、ソフトウェアの動作パフォーマンスに影響を与え、さらにはシステムがクラッシュする原因にもなります。

2) トランザクションでアクセスされるデータの量を最小限に抑える

トランザクションを同時に実行する場合、トランザクションによって操作されるデータの量が少ないほど、トランザクション間での同じデータに対する操作が少なくなります。

3) データをクエリするときにトランザクションを使用しないようにする

データの参照やクエリではデータベース データは更新されないため、システム リソースを過剰に消費しないように、トランザクションを使用してデータをクエリしないようにしてください。

4) トランザクション処理中にユーザー入力を待たないようにする

トランザクションを処理する過程で、ユーザーがデータを入力するのを待つ必要がある場合、トランザクションは長時間リソースを占有し、システムがブロックされる可能性があります。

この記事は、Huawei Cloud コミュニティ「MySQL トランザクション構文とプロセス」から共有されたもので、元の著者は Lucky Boy です。

要約する

これで、MySQL トランザクション実行の構文とプロセスに関するこの記事は終了です。MySQL トランザクションに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL トランザクションの概念と使用法の詳細な説明
  • MySQL のトランザクションに関する包括的な理解
  • MySQLのトランザクションメカニズムの詳細な理解
  • MySQL データベース トランザクション例のチュートリアル

<<:  Linux システムの仮想ホストで Swoole Loader 拡張機能を有効にする方法

>>:  HTML テーブル タグ チュートリアル (36): テーブル ヘッダーの背景色属性 BGCOLOR

推薦する

Visual Studio Codeを使用してMySqlデータベースに接続し、クエリを実行します。

Visual Studio Code は、Microsoft が開発した強力なテキスト エディター...

Mysqlサーバーのインストール、構成、起動、シャットダウン方法の詳細な説明

1. 公式サイトからダウンロード: https://dev.mysql.com/downloads/...

MySQL統計テーブルのサイズを説明する例

各データベース内の各テーブルのサイズをカウントすることは、データ ガバナンスの最も単純な要件の 1 ...

webpack イメージを base64 に変換する例

url-loader をダウンロード 糸を追加 -D URLローダー モジュール: { ルール: {...

WordPress実験を実装するための3つの仮想マシンのKVM展開の詳細説明

1. KVM の概要カーネルベースの仮想マシンの略称は、Linux 2.6.20 以降のすべての主要...

MySQLデータベースでサポートされているストレージエンジンの比較

目次ストレージエンジンMySQL でサポートされているストレージ エンジン同時実行制御ロック粒子をロ...

Linux で指定された期間に数分ごとにタスク スケジュール crontab を自動的に実行する方法

まずコードを見てみましょう #/bin/sh datename=$(日付 +%Y%m%d-%H%M%...

MySQLは挿入を使用して複数のレコードを挿入し、データを一括で追加します。

table1 に 5 つのレコードを挿入する場合、次のコードは誤りです。 テーブル1に(id,na...

Nginxホットデプロイメントの実装

目次セマフォNginx ホットデプロイメント上記のブログ投稿に従ってください。ファイアウォールをオフ...

Tomcat Nativeを使用してTomcat IO効率を向上させる方法の詳細な説明

目次導入Tomcatへの接続方法APR と Tomcat ネイティブtomcat で APR を使用...

Vue+Echart 棒グラフで疫病データ統計を実現

目次1. まずプロジェクトにechartsをインストールします2. echartsに縦棒グラフテンプ...

JavaScript データのフラット化の詳細な説明

目次フラット化とは何か再帰トストリング減らすアンダーコア_.平坦化_。連合_。違い要約するフラット化...

js キャンバスで円形の水のアニメーションを実現

この記事の例では、円形の水のアニメーションを実現するためのキャンバスの具体的なコードを参考までに共有...

Linux でディスクをマウントし、起動時に自動的にマウントするように設定する方法

皆さんの時間は貴重だと承知しているので、プロセス コマンドを直接書き留めておきます。設定できます。原...

CSSで背景ぼかしを設定する方法

ページを作成するときに、ページの見栄えを良くするために、背景画像を設定する必要があることがよくありま...