web-dev-qa-db-ja.com

明示的に設定されていない場合、Hibernateが使用するデフォルトの分離レベルは何ですか?

接続プールに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. 結局のところ、Hibernateが使用する分離レベルは何ですか? REPEATABLE_READまたはREAD_COMMITTED?
  3. 分離レベルが設定されていない場合、Hibernateは基礎となるデータベースのデフォルトを使用する必要があると思いました。これは本当ですか?たぶん、jbdcドライバーの実装が独自にデフォルトを設定し、Hibernateがこれを使用しますか?
25
Argyro Kazaki

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

パブリッククラスDatabaseMetaDataは、Java.sql.DatabaseMetaData行を実装します。

 
 1475 public int getDefaultTransactionIsolation()はJava.sql.SQLException JavaDoc {
 1476 if(this.conn.supportsIsolationLevel()){
 1477がJavaを返すsql.Connection.TRANSACTION_READ_COMMITTED; 
 1478} else {
 1479 return Java.sql.Connection.TRANSACTION_NONE; 
 1480} 
 1481} 

だから私は賭けてgetSession()。connection()。getTransactionIsolation()を信頼します

14