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

推薦する

JavaScript を使用してタイムラインとアニメーション効果を実装するためのサンプル コード (フロントエンドのコンポーネント化)

目次コードのクリーニングJavaScript の「フレーム」 「フレーム」の実装方法1. 間隔を設定...

ウェブサイトアイコンを追加するにはどうすればいいですか?

最初のステップは、アイコン作成ソフトウェアを準備することです。まず、いわゆるアイコンは拡張子 .ic...

Vue の親子コンポーネントの値転送と一方向データフローの問題の詳細な説明

目次序文1. 親コンポーネントが子コンポーネントに値を渡す2. サブコンポーネントのprops型制約...

CSSで制御可能な点線を実装する方法

序文CSS を使用して点線を生成するのは、フロントエンド開発者にとっては簡単です。一般的に、これを実...

Dockerプライベート倉庫の構築と利用の詳細説明

イメージは hub.docker.com に保存できますが、ネットワーク速度が比較的遅いです。内部環...

複数の .sql ファイルを MySQL に効率的にインポートする方法の詳細な説明

MySQL には、複数の .sql ファイル (SQL ステートメントを含む) をインポートする方法...

MYSQLの文字セット設定方法(端末の文字セット)の詳しい説明

序文ターミナルを使用してデータベースまたはテーブルを作成するたびに、文字セットが latin1 であ...

Vue の計算プロパティ

目次1. 基本的な例2. 計算プロパティキャッシュとメソッド3. 計算プロパティセッター序文:通常、...

MySQLの自動増分主キーIDはこのように処理されません

MySQLの自動増分主キーIDは段階的に増加しません1. はじめにMySQL データベースにデータを...

古典的なスネークゲームの JavaScript 実装

この記事では、古典的なスネークゲームを実装するためのJavaScriptの具体的なコードを参考までに...

WindowsでのNginxの起動や停止などの基本操作コマンドの詳しい説明

Windows で Nginx を使用するには、Nginx サービスの起動、停止、Nginx のリロ...

VUE無限レベルツリーデータ構造表示の実装

目次コンポーネントの再帰呼び出しレンダリングメソッドの使用プロジェクトに取り組んでいると、左側のメニ...

CSS で透明なグラデーション効果を実装するためのサンプルコード

Zhihu Discovery コラムのタイトル画像は、通常、以下のように表示されます。明らかに、グ...

Vue プロジェクトで TS (TypeScript) を使用するための入門チュートリアル

目次1. Typescriptの紹介2. 設定ファイル webpack 設定3. プロジェクトに.t...