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

推薦する

Vueはスクロールバースタイルを実装します

最初はブラウザのスクロールバーのスタイルを変更して効果を実現したいと思っていましたが、情報を調べてみ...

インデックススキャンを使用したMySQLソート

目次sakilaをインストールするインデックススキャンソートテーブル構造インデックススキャンをソート...

MySQLのexecute、executeUpdate、executeQueryの違い

execute、executeUpdate、executeQuery の違い (およびそれらの戻り値...

Linux システムに docker をインストールし、ssh 経由で docker コンテナにログインする方法

注: 私はCentosを使ってdockerをインストールしていますステップ1: Dockerをインス...

MySQLにログインする際のエラー「ERROR 1045 (28000)」を解決する方法

今日はサーバーにログインして、データベース内のいくつかのものを変更する準備をしました。しかし、パスワ...

HTMLページ埋め込み動画とJSコントロール切り替え動画例の詳しい説明

まず、ページにビデオを埋め込むための HTML コードは次のとおりです。コードをコピーコードは次のと...

Dockerfile における ENTRYPOINT と CMD の違い

Docker システムの学習チュートリアルでは、Dockerfile を使用して Docker イメ...

nginx で第 3 レベルドメイン名を設定する方法の例

問題の説明nginx を設定することで、異なるポートを介して異なる Web アプリケーションにアクセ...

ブラウザ(IEシリーズ)を判別するための条件付きコメント

<!--[if IE 6]> IE6 のみが認識可能 <![endif]-->...

RGBカラーテーブルコレクション

RGBカラーテーブル色英語名RGB 16色雪255 250 250 #FFFAFAゴーストホワイト2...

require/import キーワードを使用して v-for ループでローカル画像をインポートするいくつかの方法

目次問題の説明方法 1 (バックエンドが画像 URL を返す)方法 2 (フロントエンドで requ...

Linux で lvm 論理ボリューム パーティションのサイズを調整するチュートリアル (xfs や ext4 などのさまざまなファイル システム用)

序文システムをインストールしたときに、パーティション領域を適切に割り当てませんでした。その後のメンテ...

CSSスプライト技術は複数の背景を1つのPNG画像に統合しますCSSポジショニング

アメリカのYAHOOがページ制作で使用している画像統合技術。これらのアイコン、列背景、画像ボタンを定...

CSS に基づいて MaterialUI ボタン​​クリックアニメーションを実装し、それを React コンポーネントにカプセル化します。

序文フロントエンドフレームワークのヘビーユーザーとして、私はテクノロジーを選択する際にそのエコロジー...

CentOS7 systemdにカスタムシステムサービスを追加する方法

システムド: CentOS 7のサービスsystemctlスクリプトは、/usr/lib/syste...