问题描述
看起来像meta.getDefaultTransactionIsolation()); 在mysql驱动程序的DatabaseMetaData实现中被硬编码
公共类DatabaseMetaData实现java.sql.DatabaseMetaData行…。
1475 public int getDefaultTransactionIsolation()抛出java.sql.SQLException JavaDoc {
第1476章谁来了
1477返回java.sql.Connection.TRANSACTION_READ_COMMITTED;
1478} else {
1479返回java.sql.Connection.TRANSACTION_NONE;
1480}
1481}
所以我打赌并信任getSession()。connection()。getTransactionIsolation()
解决方法
我有一个使用hibernate3.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使用它吗?