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データベースのSYNフラッディング問題を解決する

Syn 攻撃は、最も一般的で最も簡単に悪用される攻撃方法です。TCP プロトコルの欠陥を利用して、偽...

Tomcat の静的ページ (html) で中国語の文字化けが発生する問題の究極の解決策

tomcatでは、jspは文字化けしませんが、htmlの中国語は文字化けします理由はいくつかあります...

純粋な CSS でカスタムラジオボタンとチェックボックス機能を実装する

1. 効果を達成する 2 知識ポイント2.1 <label> タグHTML では、<...

Dockerイメージ送信コマンドcommitの動作原理と使い方の詳細な説明

ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを D...

カルーセル例の JavaScript 実装

この記事では、カルーセルの効果を実現するためのJavaScriptの具体的なコードを参考までに共有し...

曇り空のアイコン効果を実現する純粋な CSS

効果効果は以下のとおりです​実装のアイデアbox-shadow プロパティを使用して、複数の灰色の円...

よくある HTML タグの記述エラー

HTML Police がコードを調べて意味のないタグをすべて見つけ出すので、注意を払う必要がありま...

MySQLのよくある間違い

NULL 値によると、MySQL の NULL 値は単にデータがないことを意味します。NULL 値は...

Linux サーバー上で nvidia-docker 環境を設定するプロセスの詳細な説明

Docker はコンテナに相当し、必要な動作環境に応じて対応する動作環境を構築できます。このとき、各...

DockerはClickHouseをインストールし、データテストを初期化します

クリックハウスの紹介ClickHouse は、SQL クエリを使用して分析データ レポートをリアルタ...

WeChatアプレットはシンプルなチャットルームを実装します

この記事では、WeChatアプレットの具体的なコードを共有し、簡単なチャットルームを実装します。具体...

CentOS6.8 は cmake を使用して MySQL5.7.18 をインストールします。

オンライン情報を参考に、cmakeを使用してCentOS6.8サーバーにMySQL5.7.18をイン...

JSはGMTとUTCのタイムゾーンを完全に理解しています

目次序文1. GMT GMTとはGMTの歴史2. UTC UTCとはUTC は次の 2 つの部分で構...

Linux システム (CentOS7 インストール) に JDK8 をインストールするための詳細なチュートリアル

JDKのインストールシステムのインストールについてはあまり詳しく説明しません。インストール手順はオン...