Подтвердить что ты не робот

Что такое режим изоляции 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)

Итак, мои вопросы таковы:

  • Откуда взялось значение "2"? Поскольку по умолчанию используется REPEATABLE_READ, почему getDefaultTransactionIsolation() возвращает READ_COMMITTED?
  • Каков уровень изоляции, который использует hibernate в конце концов? REPEATABLE_READ или READ_COMMITTED?
  • Я думал, что когда уровень изоляции не задан, hibernate должен использовать базовую базу данных по умолчанию. Это правда? Может быть, реализация jbdc-драйвера задает значение по умолчанию, а hibernate использует это?
4b9b3361

Ответ 1

выглядит как meta.getDefaultTransactionIsolation()); жестко закодирован в реализации DatabaseMetaData в драйвере mysql

открытый класс DatabaseMetaData реализует java.sql.DatabaseMetaData линии....

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(). connection(). getTransactionIsolation()