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

推薦する

私が遭遇したIE8の互換性に関する注意事項

1. IE8 の getElementById は id のみをサポートし、name はサポートしま...

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

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

Vue3 がデータ監視を実装するためにプロキシを使用する理由の分析

Vue データの双方向バインディング原則ですが、この方法には欠点があり、配列とオブジェクトの部分的な...

MYSQL row_number() および over() 関数の詳細な使用方法

構文フォーマット: row_number() over(partition by grouping ...

React Native環境のインストールプロセス

react-native インストールプロセス1.npx react-native init Awe...

Linux Crontab シェル スクリプトを使用して第 2 レベルのスケジュールされたタスクを実装する方法

1. シェルスクリプトcrontab.shを書く #!/bin/bash step=1 #ステップ間...

MySQL InnoDBエンジンのインデックスとストレージ構造の詳細な説明

序文Oracle や SQL Server などのデータベースには、ストレージ エンジンが 1 つだ...

DIVマスクを使用して、マウスでチェックボックスを直接チェックすることが無効である問題を解決します

フロントエンドの開発過程で、チェックボックスが必要な状況が発生しました。ユーザー操作の利便性を考慮し...

スーパーバイザーによるDockerfileのマルチサービスイメージパッケージ操作

Dockerfileの作成yumソースを設定する cd /tmp/docker vim Docker...

divの背景を透明に設定する方法の例

div の背景を透明にする一般的な方法は 2 つあります。 1. 不透明度属性を 0 ~ 1 の値に...

MySQLはランダムに一定数のレコードを抽出します

以前は、このような使用シナリオを処理するために rand() で直接 order していましたが、効...

Zabbix を使用して Oracle データベースを監視する方法の詳細な説明

1. 概要Zabbix は非常に強力で、最も広く使用されているオープンソースの監視ソフトウェアです。...

Linux のプロセスクラッシュの原因をコアダンプ技術を使用して追跡する簡単な分析

最近、プロジェクトで問題が発生しました。サーバー側のプログラムが突然クラッシュして終了しました。クラ...

CentOS 7.9 の zabbix5.0.14 のインストールと設定プロセス

目次1. 基本的な環境設定2. データベースをインストールする3. zabbix関連コンポーネントを...