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 システムのシャットダウンコマンドの違いと使い方の詳細な説明

推薦する

jsを使って簡単な計算機を作る

この記事では、jsで簡単な計算機を作成する具体的なコードを参考までに共有します。具体的な内容は次のと...

Python ベースの MySQL レプリケーション ツールの詳細な説明

目次1. はじめに2回目の練習2.1 インストールと設定2.2 コアクラスの紹介2.3 使い方は? ...

Linux環境でのDockerインストールチュートリアル

1. 設置環境Dockerは次のCentOSバージョンをサポートしていますCentOS 6.5 (6...

Linux で AutoFs マウント サービスをインストールするチュートリアル

Samba サービスでも NFS サービスでも、サーバーの起動時にリモート共有リソースが自動的にマ...

テーブルを使用する場合と CSS を使用する場合 (経験の共有)

TW のメインテキスト ページは、以前は小さなモニターと低解像度のユーザーを考慮して幅が 850 ピ...

Vue 3.0 カスタムディレクティブの使い方

目次1. カスタム指示1. グローバルカスタム指示を登録する2. グローバルカスタム指示を使用する3...

MySQLのさまざまなロックの概念的理解

楽観的ロック楽観的ロックは、主にデータ バージョン記録メカニズムに基づいて実装され、通常はデータベー...

CentOS 7でsambaを使用してフォルダーを共有するための完全な手順

序文Samba は、サーバー プログラムとクライアント プログラムで構成され、Linux システム上...

CSS background-blend-modeの仕組みを深く理解する

この記事は共有および集約することを歓迎します。全文を転載する必要はありません。著作権を尊重してくださ...

クラウド CentOS で Docker リモート サービス リンクを有効にするための実装手順

ここでは、dockerがインストールされたcentosサーバーを紹介し、リモートリンクサービスを開始...

Vue3 でマークダウン エディター コンポーネントを使用する方法

目次インストールコンポーネントのインポート基本的な使い方保存したマークダウンまたは HTML テキス...

MySQL はどのようにしてデータの整合性を確保するのでしょうか?

オンライン ビジネスにとってデータの一貫性と整合性が重要であることは明らかです。データが失われないよ...

React+Typescriptはカウントダウンフックメソッドを実装します

まず、setIntervalはフックとしてカプセル化されます👇 'react' から...