27

我有一个使用休眠版本 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 使用它?
4

1 回答 1

16

看起来像 meta.getDefaultTransactionIsolation()); 在 mysql 驱动程序中的 DatabaseMetaData 实现中被硬编码

公共类 DatabaseMetaData 实现 java.sql.DatabaseMetaData 行....

1475 public int getDefaultTransactionIsolation() 抛出 java.sql.SQLException JavaDoc {
第1476章
第1477章
第1478章
第1479章
第1480章
第1481章

所以我敢打赌并相信 getSession().connection().getTransactionIsolation()

于 2011-06-27T07:51:32.620 回答