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 を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。 以下もご興味があるかもしれません:
|
>>: Linux システムのシャットダウンコマンドの違いと使い方の詳細な説明
序文最近のプロジェクトでは、大量のデータを保存する必要があり、このデータには有効期限があります。クエ...
Syn 攻撃は、最も一般的で最も簡単に悪用される攻撃方法です。TCP プロトコルの欠陥を利用して、偽...
tomcatでは、jspは文字化けしませんが、htmlの中国語は文字化けします理由はいくつかあります...
1. 効果を達成する 2 知識ポイント2.1 <label> タグHTML では、<...
ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを D...
この記事では、カルーセルの効果を実現するためのJavaScriptの具体的なコードを参考までに共有し...
効果効果は以下のとおりです実装のアイデアbox-shadow プロパティを使用して、複数の灰色の円...
HTML Police がコードを調べて意味のないタグをすべて見つけ出すので、注意を払う必要がありま...
NULL 値によると、MySQL の NULL 値は単にデータがないことを意味します。NULL 値は...
Docker はコンテナに相当し、必要な動作環境に応じて対応する動作環境を構築できます。このとき、各...
クリックハウスの紹介ClickHouse は、SQL クエリを使用して分析データ レポートをリアルタ...
この記事では、WeChatアプレットの具体的なコードを共有し、簡単なチャットルームを実装します。具体...
オンライン情報を参考に、cmakeを使用してCentOS6.8サーバーにMySQL5.7.18をイン...
目次序文1. GMT GMTとはGMTの歴史2. UTC UTCとはUTC は次の 2 つの部分で構...
JDKのインストールシステムのインストールについてはあまり詳しく説明しません。インストール手順はオン...