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