MySQLとSpringの自動コミットの詳細な説明

MySQLとSpringの自動コミットの詳細な説明

1 MySQLの自動コミット設定

MySQL はデフォルトで自動的にコミットします。つまり、各 DML (追加、削除、変更) ステートメントは個別のトランザクションとして暗黙的にコミットされます。ステータスがクローズに変更された場合、DML ステートメントを有効にするには手動で送信する必要があります。
現在のセッションの自動コミットが有効になっているかどうかを確認します。

mysql> 'autocommit' のような変数を表示します。
+---------------+-------+
| 変数名 | 値 |
+---------------+-------+
| 自動コミット | オン |
+---------------+-------+

グローバル自動コミットが有効になっているかどうかを確認します。

mysql> 'autocommit' のようなグローバル変数を表示します。
+---------------+-------+
| 変数名 | 値 |
+---------------+-------+
| 自動コミット | オン |
+---------------+-------+

自動コミット変数を変更することで、操作をオン/オフにすることができます。

現在のセッションの自動コミット モードをオフにします。mysql> set autocommit=0;

 
mysql> 'autocommit' のような変数を表示します。
+---------------+-------+
| 変数名 | 値 |
+---------------+-------+
| 自動コミット | オフ |
+---------------+-------+

 グローバル自動コミットはまだ有効です。mysql> show global variables like 'autocommit';
+---------------+-------+
| 変数名 | 値 |
+---------------+-------+
| 自動コミット | オン |
+---------------+-------+

 
 グローバル自動コミットを無効にする
mysql> グローバル自動コミットを 0 に設定します。

 
mysql> 'autocommit' のようなグローバル変数を表示します。
+---------------+-------+
| 変数名 | 値 |
+---------------+-------+
| 自動コミット | オフ |
+---------------+-------+

再起動後も MySQL サービスを有効にしたい場合は、システム環境変数を設定する必要があります。 MySQL 5.7 cnf 構成ファイルの [mysqld] の下に自動コミット値を設定します。

[mysqld]
...
自動コミット=0

Springでの自動送信の制御

MySQL JDBC ドライバ パッケージ mysql-connector-java は、デフォルトでセッション接続の自動コミットを有効にします。たとえば、mysql-connector-java-8.0.22 バージョンのコードは次のようになります。

//com.mysql.cj.protocol.a.NativeServerSession.java
  プライベートブール値 autoCommit = true;

HikariCP、druid などのよく使用されるデータベース接続プールも、デフォルトで自動コミットを有効にし、接続の自動コミット設定を true に変更します。
Druid は、DataSource を初期化するときに、接続の自動コミットを true に設定します。コードは次のとおりです。

com.alibaba.druid.pool.DruidAbstractDataSource.java
  保護された揮発性ブール値の defaultAutoCommit = true;
  ...
  パブリック void initPhysicalConnection(Connection conn、Map<String, Object> variables、Map<String, Object> globalVariables) は SQLException をスローします {
    conn.getAutoCommit() が defaultAutoCommit と異なる場合、
      //接続の自動コミットをtrueに設定する
      conn.setAutoCommit(デフォルトのAutoCommit);
    }
    ...
 
  }

HikariCP は、デフォルトで autocommit を true に設定して DataSource を初期化します。

com.zaxxer.hikari.HikariConfig.java
  パブリックHikariConfig()
  {
   ...
   isAutoCommit は true です。
  }

PlatformTransactionManager トランザクション マネージャーによって管理される明示的なトランザクション (@Transactional アノテーション宣言など) の場合、トランザクションが開かれると自動コミット モードはオフになります。 コードは次のとおりです。

	@オーバーライド
	保護された void doBegin(オブジェクトトランザクション、トランザクション定義定義) {
		DataSourceTransactionObject txObject = (DataSourceTransactionObject) トランザクション;
		接続 con = null;

		試す {
      		........

			// 必要に応じて手動コミットに切り替えます。これは一部のJDBCドライバでは非常にコストがかかります。
			// 不必要にそれを行いたくありません(例えば、明示的に
			// 接続プールはすでに設定されているように構成されています。
			con.getAutoCommit() の場合 {
				txObject.setMustRestoreAutoCommit(true);
				ロガーがデバッグ有効の場合
					logger.debug("JDBC接続[" + con + "]を手動コミットに切り替えています");
				}
                //自動コミットモードをオフにする con.setAutoCommit(false);
			}

      		.......
		}

		キャッチ (Throwable ex) {
     		.......
		}
	}

要約する

MySQL の自動コミット モードはデフォルトでオンになっています。手動の DML 操作によるエラーを防ぐために、本番環境をデフォルトのクローズ状態に設定できます。通常、JDBC 接続プールはデフォルトで有効になっており、構成可能です。明示的なトランザクションでは、クローズ状態に設定されます。データベース環境の自動コミットを変更するだけでは、コードの動作には影響しません。

以上がMySQLとSpringの自動コミットについての詳しい説明です。MySQLの自動コミットについてさらに詳しく知りたい方は、123WORDPRESS.COM内の他の関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • MySQL でコミットされていないトランザクションを見つけるための SQL の例の簡単な分析
  • MySQL でトランザクションのコミットとロールバックを実装する方法の詳細な例
  • MySQL でコミットされていないトランザクション情報を見つける方法
  • Mysql トランザクション分離レベルの読み取りコミットの詳細な説明
  • MySQL の InnoDB テーブルの書き込み速度に対するインデックスとコミット頻度の影響を調べる
  • PHP がテキストエリアデータを MySQL に送信するときに多くのスペースが発生する問題の解決方法
  • MySQLはトランザクションのコミットとロールバックの例を実装しています
  • Python は MySQL に接続し、MySQL トランザクションの例を送信します
  • JSP + MySQL 中国語の文字化け問題 投稿投稿文字化けの解決方法

<<:  XHTML 入門チュートリアル: よく使われる XHTML タグ

>>:  JavaScript 配列と非配列オブジェクトのディープ クローンとシャロー クローンの原則の詳細な説明

推薦する

Alibaba Cloud OSS アクセス権設定(RAM 権限制御)実装

シナリオmyBuket の static/material/ ディレクトリなど、Alibaba Cl...

XHTML 3つの文書型宣言

XHTML は 3 つのドキュメント タイプ宣言を定義します。最もよく使用されるのは XHTML T...

MySQL学習エンジンの詳細な説明、説明、権限

エンジン導入InnodbエンジンInnodb エンジンは、データベース ACID トランザクションを...

Vue ファースト スクリーン パフォーマンス最適化コンポーネントの知識ポイントの概要

Vue ファースト スクリーン パフォーマンス最適化コンポーネントVue ファースト スクリーン パ...

MySQL ツリー構造データベース テーブル設計

目次序文1. 基本データ2. 継承駆動設計3. 左右の値のエンコーディングに基づく設計4. ツリー構...

CSS で div 凹角スタイルを実装するサンプル コード

通常の開発では、凸型の丸い角、つまり border-radius 属性を使用するのが一般的です。凹角...

MySQLの文字タイプは大文字と小文字を区別します

デフォルトでは、MySQLの文字タイプは大文字と小文字を区別しません。つまり、name='A...

MySQLはJSON内部フィールドを抽出し、数値としてダンプします

目次背景問題分析1. 属性値はJson形式であり、Json操作関数を使用して処理する必要があります。...

three.js を使用してクールなアシッドスタイルの 3D ページ効果を実現します

この記事では、主にReact + three.jsテクノロジースタックを使用して3Dモデルの読み込み...

MySQL の自己結合重複排除に関する注意事項

機能シナリオを簡単に説明しましょう。データ行フィールドは次のとおりです。名前開始日時タイプこの表では...

MySQL 5.7.10 インストール ドキュメント チュートリアル

1. 依存パッケージをインストールする yum -y インストール gcc-c++ ncurses-...

CSSスタイルは、テキストが長すぎる場合に省略記号を表示する問題を解決します

1. CSSスタイルは、テキストが長すぎる場合に省略記号を表示する問題を解決します1. 一般的なスタ...

XHTMLにおけるH1タグの位置について

最近、H1 については多くの議論が行われていますが (記事のコンテンツ ページ内)、おおよそ 2 つ...

ウェブサイトのAboutページの紹介コンテンツの書き方

公式、電子商取引、ソーシャル ネットワーキング、個人のいずれの Web サイトでも、訪問者に貴重な時...

Docker 階層化パッケージを使用して Spring Boot を設定する方法

Spring Boot プロジェクトでは、Docker コンテナ、jar、war の階層化パッケージ...