2011-06-26 4 views
21

私は、接続プーリングにhibernateバージョン3.6.4とc3p0バージョン0.9.1.2を使用するアプリケーションを持っています。私の基になるRDBMSはMySqlバージョン5.0.67です。 MySQL明示的に設定されていない場合、hibernateが使用するデフォルトの隔離レベルは何ですか?

私のインストールでは、デフォルトのトランザクション分離レベルは、「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. 私は、分離レベルが設定されていない場合、hibernateは基になるデータベースのデフォルトを使用するべきだと考えました。これは本当ですか?たぶん、jbdcドライバの実装がそれ自身のデフォルトを設定し、ハイバネートがこれを使用するのでしょうか?

答えて

13

は、meta.getDefaultTransactionIsolation())のようになります。 は

 

1475 public int getDefaultTransactionIsolation() throws java.sql.SQLException JavaDoc { 
1476  if (this.conn.supportsIsolationLevel()) { 
1477   return java.sql.Connection.TRANSACTION_READ_COMMITTED; 
1478  } else { 
1479   return java.sql.Connection.TRANSACTION_NONE; 
1480  } 
1481 } 

ので、私は賭けとのgetSession()を信用したい....

パブリッククラスDatabaseMetaDataのはのjava.sql.DatabaseMetadataに ラインを実装してMySQLドライバでのDatabaseMetaDataの実装にハードコードされています。接続を().getTransactionIsolation()

+2

接続()が廃止されて以来、どのようにhibernate 4で同じことを達成できますか? 。このよう – emt14

+0

:。。。 ((((SessionFactoryImplementor)のgetSession()のgetSessionFactory()).getJdbcServices()はgetConnectionProvider()のgetConnection()getTransactionIsolation() //メソッドは、 "接続プールがexausted" 非推奨と引き起こしますエラーが、私は実際の方法があると思い 作業: getSession.doWork(新しい仕事(){@Overrideボイド実行(接続CONN){/ * CONNでの作業* /}}); しかし、私は「M。それがセッション中に動作しているかどうかをチェックしません。 – Lord

関連する問題