接続プール用に hibernate バージョン 3.6.4 と c3p0 バージョン 0.9.1.2 を使用するアプリケーションがあります。私の基礎となる RDBMS は、MySql バージョン 5.0.67 です。
私のインストールした MySql は、デフォルトのトランザクション分離レベルが "REPEATABLE-READ" (4) であることを示しています。
mysql> select @@GLOBAL.tx_isolation, @@tx_isolation;
+-----------------------+-----------------+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+-----------------------+-----------------+
| REPEATABLE-READ | REPEATABLE-READ |
+-----------------------+-----------------+
hibernate.cfg.xml 内またはアプリケーション内のどこでも、トランザクション分離レベルを変更または構成していません。アプリから、次のコードを使用して構成を出力します。
DatabaseMetaData meta = getSession().connection().getMetaData();
System.out.println("Default Tx Isolation: " + meta.getDefaultTransactionIsolation());
System.out.println("Current Tx Isolation: " + getSession().connection().getTransactionIsolation());
そして、次の結果が得られます。
Default Tx Isolation: 2 (=READ_COMMITTED)
Current Tx Isolation: 4 (=REPEATABLE_READ)
だから、私の質問は次のとおりです。
- 「2」という値はどこから来たのですか? デフォルトは REPEATABLE_READ であるのに、getDefaultTransactionIsolation()が READ_COMMITTED を返すのはなぜですか?
- 結局、休止状態が使用する分離レベルは何ですか? REPEATABLE_READ または READ_COMMITTED?
- 分離レベルが設定されていない場合、休止状態は基礎となるデータベースのデフォルトを使用する必要があると考えました。これは本当ですか?おそらく、jbdc ドライバーの実装が独自にデフォルトを設定し、休止状態がこれを使用するのでしょうか?