MySQL トランザクション自動コミット自動コミット操作

MySQL トランザクション自動コミット自動コミット操作

MySQL のデフォルトの動作モードは自動コミット モードです。つまり、明示的にトランザクションを開始しない限り、各クエリは個別のトランザクションとして自動的に実行されます。 autocommit の値を設定することで、自動コミット モードかどうかを変更できます。

次のコマンドを使用して、現在の自動コミットモードを表示できます。

mysql> 'autocommit' のような変数を表示します。
+---------------+-------+
| 変数名 | 値 |
+---------------+-------+
| 自動コミット | オン |
+---------------+-------+
セット内の1行(0.04秒)

クエリ結果から、Value の値が ON であることがわかります。これは、自動コミットがオンになっていることを意味します。このモードは次のSQL文で変更できます。

mysql> 自動コミットを 0 に設定します。

値 0 は OFF と同じで、もちろん 1 は ON を意味します。上記の autocommit=0 を設定すると、コミットまたはロールバック ステートメントが実行されて現在のトランザクションが終了し、新しいトランザクションが開始されるまで、ユーザーはトランザクション内に留まります。

たとえば、張三は李思に500元を送金します。データベース内の操作は次のようになります。

1.まず張三の口座残高が十分かどうか確認する

2. 張三の口座から500元が引き落とされる

3. 李思の口座に500元を追加する

上記の 3 つのステップは、コミットのために 1 つのトランザクションにまとめることができます。すべてを実行するか、まったく実行しないかのどちらかです。すべてが正常であれば、コミットしてデータを永続的に変更します。エラーがある場合は、変更前の状態にロールバックします。トランザクション処理を使用すると、張三のお金は減っても李思の口座の残高は 500 元増えない、あるいは張三のお金は減っても李思の口座の残高は 500 元増えるといったことは起こりません。

MySQL のデフォルトのストレージ エンジンは MyISAM ですが、トランザクション処理をサポートしていないため、自動コミットを変更しても効果はありません。ただし、エラーは報告されないので、トランザクション処理を使用する場合は、操作するデータベースが InnoDB などのトランザクション処理をサポートしていることを確認してください。テーブルのストレージ エンジンがわからない場合は、テーブル作成ステートメントをチェックして、テーブルの作成時にトランザクション タイプが指定されたストレージ エンジンがあるかどうかを確認できます。ストレージ エンジンが指定されていない場合、デフォルトのストレージ エンジンはトランザクションをサポートしない MyISAM です。

もちろん、トランザクション処理はテーブル データの原子性、一貫性、独立性、および永続性を確保するためのものです。

これらはシステムリソースを消費するため、慎重に選択してください。

補足: MySQL トランザクション処理 (Transation) と自動実行 (AutoCommit) および送信タイプ (Completion)

1. 取引

コンピュータ用語では、トランザクションとは、データベース内のさまざまなデータ項目にアクセスし、場合によっては更新するプログラム実行の単位を指します。トランザクションは主に、操作量が多く複雑度の高いデータを処理するために使用されます。マスター テーブル内の情報の一部を削除する場合、マスター テーブルに複数のスレーブ テーブルがある場合は、詳細を段階的に削除してから、マスター テーブルの情報を削除する必要があります。このプロセスはエラーが発生しやすいです。この場合、トランザクションを使用して処理するのが最適です。

2. 取引の利用

取引を開始するか開始する

専念

ロールバック

3. MYSQLでサポートされているエンジン(InnoDB)

エンジンを表示します。

4. 自動コミットと完了

トランザクションを使用するには、暗黙的なトランザクションと明示的なトランザクションの 2 つの方法があります。暗黙的なトランザクションは、実際には自動コミットです。Oracle はデフォルトでは自動的にコミットしないため、手動で COMMIT を記述する必要があります。 MySQL では、トランザクションをサポートするエンジンで自動コミットが有効になっています。autocommit=true の場合、コミットせずにステートメントが直接送信され、永続的な変更が行われます。MySQL では、自動コミットがデフォルトでオンになっていますが、構成を通じて設定することもできます。

autocommit=0 に設定する(自動コミットオフ)
autocommit=1 を設定します (自動コミットオン)
完了タイプを 0 に設定 (チェーンなし)
完了タイプを1に設定;(チェーン)
完了タイプを2に設定(リリース)

ステートメントを通じて現在の構成を照会することもできます

'%autocommit%' のような変数を表示します。
'%completion%' のような変数を表示します。 

5. 検証例

mysql> 開始します;
 -> INSERT INTO test SELECT 'Guan Yu';
 -> コミット;
 -> 開始;
 -> INSERT INTO test SELECT '張飞';
 -> INSERT INTO test SELECT '張飞';
 -> ロールバック;
 -> SELECT * FROM テスト;
 -> //
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
クエリは正常、1 行が影響を受けました (0.00 秒)
記録: 1 重複: 0 警告: 0
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
クエリは正常、影響を受けた行は 0 行 (0.03 秒)
クエリは正常、1 行が影響を受けました (0.03 秒)
記録: 1 重複: 0 警告: 0
エラー 1062 (23000): キー 'PRIMARY' のエントリ '张飞' が重複しています

mysql> テストから * を選択します;//

現在のウィンドウの結果:

新しいウィンドウの結果:

結論: テストテーブル内の名前の一意性制約のため、コードを見ると、2 つの「張飛」が実行された後 (主キー制約がトリガーされるかどうかに関係なく)、2 番目の「張飛」が実際に一意性制約例外をトリガーするため、トランザクションが飛び出すと思います。したがって、現在の接続では、テストテーブルに 1 つの張飛が見られます。実際には、2 番目のトランザクションは正常に送信されていません。

次に、通常通りデータを送信してみます。

mysql> 開始します;
 -> INSERT INTO test SELECT 'Guan Yu';
 -> コミット;
 -> 開始;
 -> INSERT INTO test SELECT '張飞';
 -> INSERT INTO test SELECT 'Liu Bei';
 -> ロールバック;
 -> //
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
クエリは正常、1 行が影響を受けました (0.00 秒)
記録: 1 重複: 0 警告: 0
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
クエリは正常、1 行が影響を受けました (0.03 秒)
記録: 1 重複: 0 警告: 0
クエリは正常、1 行が影響を受けました (0.04 秒)
記録: 1 重複: 0 警告: 0
クエリは正常、影響を受けた行は 0 行 (0.04 秒)


mysql> テストから * を選択します;//

現在のウィンドウの結果:

新しいウィンドウの結果:

結論: 今回のテスト結果と比較すると、最初のテストではロールバックを実行せず、トランザクション処理の例外メカニズムから飛び出してしまったと考えられます。

MySQL はデフォルトで自動コミットをオンにしているので、明示的なトランザクションがない (つまり、begin がない) 場合に、2 つの「Zhang Fei」が互いにどのように処理するかを確認したいと思います。

mysql> 開始します;
 -> INSERT INTO test SELECT 'Guan Yu';
 -> コミット;
 -> INSERT INTO test SELECT '張飞';
 -> INSERT INTO test SELECT '張飞';
 -> ロールバック;
 -> //
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
クエリは正常、1 行が影響を受けました (0.00 秒)
記録: 1 重複: 0 警告: 0
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
クエリは正常、1 行が影響を受けました (0.05 秒)
記録: 1 重複: 0 警告: 0

エラー 1062 (23000): キー 'PRIMARY' のエントリ '张飞' が重複しています
mysql> *from test; を選択します。//

現在のウィンドウの結果:

新しいウィンドウの結果:

結論: 実際、実行結果から、最初の「Zhang Fei」は別のトランザクションとして正常に実行され、2 番目の「Zhang Fei」は主キー制約がトリガーされたために失敗したことがわかります。トランザクションを表示することに加えて、トランザクションを終了する前に (コミットなしで) 2 つの「Zhang Fei」を 1 つのトランザクションにマージする方法はありますか?

completion_type=1;(chain) を設定できます。これは、「Zhang Fei」がいくつあっても、送信される前はすべて 1 つのトランザクションであることを意味します。

コードは上記と同じです。

mysql> @@completion_type を 1 に設定します。
 -> 開始;
 -> INSERT INTO test SELECT 'Guan Yu';
 -> コミット;
 -> INSERT INTO test SELECT '張飞';
 -> INSERT INTO test SELECT '張飞';
 -> ロールバック;
 -> //
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
クエリは正常、1 行が影響を受けました (0.02 秒)
記録: 1 重複: 0 警告: 0
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
クエリは正常、1 行が影響を受けました (0.02 秒)
記録: 1 重複: 0 警告: 0
エラー 1062 (23000): キー 'PRIMARY' のエントリ '张飞' が重複しています

現在のウィンドウの結果:

新しいウィンドウの結果:

結論: 最初の「Zhang Fei」の前に begin を追加するのと同じである、completion_type = 1 (チェーン) を設定したため、2 番目の「Zhang Fei」によって主キー制約がトリガーされ、トランザクションが失敗し、データの挿入が失敗しました。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • MySQLにおけるトランザクション分離レベルの実装原理の詳細な説明
  • MySQLトランザクションを実行するための構文とプロセスの詳細な説明
  • mysql と oracle のデフォルトのトランザクション分離レベルの説明
  • トランザクションとロックを表示するための MySQL の一般的なステートメント
  • MySQL マスタースレーブ同期、トランザクションロールバックの実装原理
  • MySQLデータベースのトランザクションとロックの詳細な分析
  • Mysql トランザクションで Update を実行するとテーブルがロックされますか?
  • PHP+MySQL 分散トランザクションとソリューションに関する深い理解
  • MySQL は ACID トランザクションをどのように実装しますか?
  • MySQL が大規模トランザクションを避けるべき理由とその解決方法
  • MySQLにおけるトランザクションの永続性実装原理の詳細な説明

<<:  Vue ページに img 画像を導入する方法

>>:  Linux システムのシャットダウンコマンドの違いと使い方の詳細な説明

推薦する

MySQLトリガーの詳細な説明と簡単な例

MySQLトリガーの簡単な例文法CREATE TRIGGER <トリガー名> -- トリ...

JavaScript の isPrototypeOf 関数

目次1. isPrototypeOf()例 1、オブジェクト クラス インスタンス:例 2: Hum...

MySQL設定ファイルを変更できない問題の解決方法(Win10)

他の人のために解決した問題を記録します。問題の説明MySQLのバージョンは5.7、オペレーティングシ...

CocosCreatorオブジェクトプールの使い方

目次序文:特定の操作ステップ1: プレハブを準備するステップ2: オブジェクトプールを初期化するステ...

DockerでSpring Bootアプリケーションを実行する方法

ここ数日、dockerでSpring Bootアプリケーションを実行する方法を勉強してきました。以前...

Nest.js 環境変数の設定とシリアル化の詳細な説明

環境変数の設定の簡単な説明プログラムは、環境によって異なる環境変数を必要とします。たとえば、実稼働環...

JavaScript による Web ページ カルーセルの超詳細な実装

目次HTML ページの作成js部分の機能を実装する1. 左ボタンと右ボタン2. 小さな円を動的に生成...

MySQLのinnodb_data_file_pathパラメータを変更する際の注意事項

序文innodb_data_file_path は、innodb テーブルスペース ファイルを指定す...

LinuxにNginxをインストールする詳細な手順

1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...

Vue.jsの機能コンポーネントに関する包括的な理解

目次序文React 関数コンポーネントVue (2.x) の機能コンポーネント🌰 例: el-tab...

Flex モバイルレイアウトにおけるシングルラインレイアウトとダブルラインレイアウトの違いと使い方

レイアウトにul>liを使用した単一行レイアウトを以下に示します。 <ul class=...

MySQL の一般的な SQL ステートメントの概要

1. mysqlエクスポートファイル: SELECT `pe2e_user_to_company`....

Ubuntuはカーネルモジュールをコンパイルし、その内容はシステムログに反映されます。

目次1.Linuxログインインターフェース2. コードを書く3. Makefileを書く4. コンパ...

MySQLの重複排除方法

MySQLの重複排除方法【初級】繰り返しのセリフが少ないdistinctive を使用してそれらを見...

全画面ページのスクロール効果を実現するJavaScript

JavaScript DOM を読み終えた後、解釈型 JavaScript スクリプト言語に対する...