У меня есть приложение, которое использует Hibernate версии 3.6.4 и c3p0 версии 0.9.1.2 для пула соединений. Моя базовая СУБД - 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 использует это?