27

接続プール用に 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)

だから、私の質問は次のとおりです。

  1. 「2」という値はどこから来たのですか? デフォルトは REPEATABLE_READ であるのに、getDefaultTransactionIsolation()が READ_COMMITTED を返すのはなぜですか?
  2. 結局、休止状態が使用する分離レベルは何ですか? REPEATABLE_READ または READ_COMMITTED?
  3. 分離レベルが設定されていない場合、休止状態は基礎となるデータベースのデフォルトを使用する必要があると考えました。これは本当ですか?おそらく、jbdc ドライバーの実装が独自にデフォルトを設定し、休止状態がこれを使用するのでしょうか?
4

1 に答える 1

16

meta.getDefaultTransactionIsolation()); のように見えます。mysql ドライバーの DatabaseMetaData の実装でハードコーディングされている

public クラス DatabaseMetaData は java.sql.DatabaseMetaData 行を実装しています....

1475 public int getDefaultTransactionIsolation() が java.sql.SQLException JavaDoc をスローします {
1476 if (this.conn.supportsIsolationLevel()) {
1477 return java.sql.Connection.TRANSACTION_READ_COMMITTED;
1478 } その他 {
1479 return java.sql.Connection.TRANSACTION_NONE;
1480 }
1481 }

getSession().connection().getTransactionIsolation() に賭けて信頼します

于 2011-06-27T07:51:32.620 に答える