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

推薦する

SQL と MySQL のステートメント実行順序の分析

今日、問題が発生しました: MySQL の insert into、update、delete ステ...

Windows Server 2016 でサービスを展開する方法 (グラフィック チュートリアル)

導入インストールするシステムの数が多い場合、USB フラッシュ ドライブまたは CD を使用した手動...

MySQL 5.7.18 Green Edition のダウンロードとインストールのチュートリアル

この記事では、MySQL 5.7.18のグリーンバージョンをダウンロードしてインストールする詳細な手...

CentOS 7にMySQLをインストールする詳細な手順

CentOS7では、MySQLをインストールすると、MariaDBもデフォルトでインストールされます...

CSS における px、em、rem、pt の特徴、違い、変換について詳しく説明します。

コンセプト紹介: 1. px (ピクセル):仮想的な長さの単位で、コンピュータ システムのデジタル画...

CSS を使用してマウスをホバーすることで他のタグのスタイルを変更するサンプルコード

序文:私の知る限り、現在 CSS で制御できるのは、タグをホバーしたときにそのタグの下の兄弟タグとサ...

VMware に CentOS7 をインストールし (静的 IP アドレスを設定)、Docker コンテナ経由で mySql データベースをインストールする (非常に詳細なチュートリアル)

2 年生から、これらのインストールと設定の仕方を尋ねられました。簡単なチュートリアルを作成し、ここ...

Linux での MySQL のインストールに関する詳細なチュートリアル

1. MySQLサービスをシャットダウンする# service mysqld stop 2. rpm...

bash のスクリプトデバッグメカニズムの詳細な説明

スクリプトをデバッグモードで実行するbash -x <script> を使用すると、スク...

Vue の computed と watch の違いを分析する

目次1. 計算入門1.1、getとsetの使い方1.2. 計算された属性キャッシュ2. 時計の紹介3...

Spark SQL の 4 つの一般的なデータ ソースの詳細な説明

汎用ロード/書き込みメソッドオプションを手動で指定するSpark SQL の DataFrame イ...

Kali Linux Vmware 仮想マシンのインストール (図とテキスト)

準備: 1. VMwareワークステーションソフトウェアをインストールする2. Kali Linux...

Vueはシンプルなショッピングカートの例を実装します

この記事では、参考までに、Vue の具体的なコードを共有して、簡単なショッピングカートを実装します。...

Vue プロジェクトのパッケージ化、マージ、圧縮により、Web ページの応答速度を最適化します。

目次序文1. リクエスト内容が大きすぎる解決: CDN の紹介リクエストリソースを圧縮する1. HT...

MySQL 最適化: キャッシュ最適化 (続き)

MySQL 内部には至るところにキャッシュがあります。MySQL のソースコードを読むと、キャッシ...